mruby/cの呼び出し
サンプルのコードをテキトーに張りました.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "mrubyc.h"
int hal_write(int fd, const void *buf, int nbytes)
{
return 1;
}
int hal_flush(int fd)
{
return 1;
}
static const uint8_t
#if defined __GNUC__
__attribute__((aligned(4)))
#elif defined _MSC_VER
__declspec(align(4))
#endif
bin[] = {
0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x36,0x7a,0xa8,0x00,0x00,0x00,0x77,0x4d,0x41,
0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0x59,0x30,0x30,
0x30,0x32,0x00,0x00,0x00,0xae,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x1f,
0x21,0x00,0x14,0x10,0x01,0x4f,0x02,0x00,0x2e,0x01,0x00,0x01,0x10,0x01,0x07,0x02,
0x2e,0x01,0x01,0x01,0x11,0x01,0x22,0x01,0x00,0x03,0x0f,0x01,0x37,0x01,0x67,0x00,
0x00,0x00,0x01,0x00,0x00,0x06,0x73,0x61,0x6d,0x70,0x6c,0x65,0x00,0x00,0x00,0x02,
0x00,0x04,0x70,0x75,0x74,0x73,0x00,0x00,0x05,0x73,0x6c,0x65,0x65,0x70,0x00,0x45,
0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
};
#define MEMORY_SIZE (0x400)
static uint8_t memory_pool[MEMORY_SIZE];
void mbrc_test(void)
{
mrbc_init(memory_pool, MEMORY_SIZE);
if(mrbc_create_task(bin, 0) != NULL){
mrbc_run();
}
}
mrubyc.h の作成
src/mrubyc.h は存在しますが、ライブラリ内部処理の全部のヘッダを読むみたいでした. それはユーザー側が手を出す必要のない定義が大量に含まれていたり、前回の src/hal の問題がありまして厄介でした.
API の記述はアーカイブになかったので不明で、上記の呼び出し側で使う関数が記述されていた src/rrt0.h を編集し、 include/mrubyc.h を別途作成しました.
#ifndef MRBC_INCLUDE_MRUBYC_H_
#define MRBC_INCLUDE_MRUBYC_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
struct RTcb;
struct RMutex;
#define MRBC_MUTEX_INITIALIZER { 0 }
void mrbc_tick(void);
void mrbc_init(uint8_t *ptr, unsigned int size);
void mrbc_init_tcb(struct RTcb *tcb);
struct RTcb *mrbc_create_task(const uint8_t *vm_code, struct RTcb *tcb);
int mrbc_start_task(struct RTcb *tcb);
int mrbc_run(void);
void mrbc_sleep_ms(struct RTcb *tcb, uint32_t ms);
void mrbc_relinquish(struct RTcb *tcb);
void mrbc_change_priority(struct RTcb *tcb, int priority);
void mrbc_suspend_task(struct RTcb *tcb);
void mrbc_resume_task(struct RTcb *tcb);
struct RMutex *mrbc_mutex_init(struct RMutex *mutex);
int mrbc_mutex_lock(struct RMutex *mutex, struct RTcb *tcb);
int mrbc_mutex_unlock(struct RMutex *mutex, struct RTcb *tcb);
int mrbc_mutex_trylock(struct RMutex *mutex, struct RTcb *tcb);
#ifdef __cplusplus
}
#endif
#endif // ifndef MRBC_INCLUDE_MRUBYC_H_
struct RTcb; struct RMutex; の中身はここでは未定義とし、ポインタだけ使うようにしました. 必要になるのでしたら別途編集したほうがいいです.
このような隠蔽化されたヘッダがなくやユーザーが必要な API が記述されてないのは、実用するかの評価ではかなり悪いです.