16bitPICでmruby/cをやってみました。ターゲットは、PIC24にしました。
公式対応してますし、やり方は、ITOCさんのwebsiteに「mruby/cのPIC24へのポーティング手順公開について」ってのが有りますので、さほど悩むことないのではないかと。
ツールのインストール
ポーティング手順を見ながらと・・・microchip社のリンクが全滅ですね。
microchip社のwebsite内で調べて「MPLAB X IDE v6.15」「XC16 V2.10」のインストーラをダウンロードしインストールします。
ポーティング手順から変わった所
mruby/cのソースをダウンロードして展開します。今回は、「hal_pic24」が有りますのでフォルダリネームや削除は不要ですね。
プロジェクトプロパティは、XC16 の所をちょっと弄ります。あとは、手順通りです。
設定場所1 | 設定場所2 | 設定項目 | 内容 |
---|---|---|---|
XC16 | Most Useful Option | C include dirs | src |
XC16 | Most Useful Option | Define common macros | MRBC_NO_TIMER, MRBC_USE_HAL_PIC24 |
XC16 | Most Useful Option | Code model | Large |
main.cは、mcc周りの使い方が若干変わった程度でしょう。
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/mcc.h"
#include "mrubyc.h"
extern const uint8_t sample1[];
#define MEMORY_SIZE (1024*20)
static uint8_t memory_pool[MEMORY_SIZE];
//================================================================
/*! オンボードSW 現在状態の読み込み
*/
static void c_sw1_read(mrb_vm *vm, mrb_value *v, int argc) {
int sw1 = I_S4_GetValue();
SET_INT_RETURN(sw1);
}
//================================================================
/*! オンボードLED ON/OFF
*/
static void c_led1_write(mrb_vm *vm, mrb_value *v, int argc) {
int set_value = GET_INT_ARG(1);
if (set_value == 0)
O_LED3_SetLow();
else
O_LED3_SetHigh();
}
/*
Main application
*/
int main(void)
{
// initialize the device
SYSTEM_Initialize();
mrbc_init(memory_pool, MEMORY_SIZE);
mrbc_define_method(0, mrbc_class_object, "sw1_read", c_sw1_read);
mrbc_define_method(0, mrbc_class_object, "led1_write", c_led1_write);
mrbc_create_task(sample1, 0);
mrbc_run();
return 1;
}
//================================================================
/*! HAL
*/
int hal_write(int fd, const void *buf, int nbytes) {
return 0;
}
int hal_flush(int fd) {
return 0;
}
hal_pic24/hal.h は変更なしです。
vm_config.h は、MRBC_REQUIRE_32BIT_ALIGNMENT へ変更
/* Word alignment
If 32bit and/or 64bit alignment is required, enable the following line.
*/
#define MRBC_REQUIRE_32BIT_ALIGNMENT
//#define MRBC_REQUIRE_64BIT_ALIGNMENT
alloc.c 大幅に変わってます。
98行目のコメントを取り、「MRBC_MIN_MEMORY_BLOCK_SIZE」を有効にしておきます。
#if !defined(MRBC_MIN_MEMORY_BLOCK_SIZE)
#define MRBC_MIN_MEMORY_BLOCK_SIZE sizeof(FREE_BLOCK)
#define MRBC_MIN_MEMORY_BLOCK_SIZE (1 << MRBC_ALLOC_IGNORE_LSBS)
#endif
実行結果
sample1.rb をmrbcでコンパイルした sample1.cを入れ、コンパイルと書き込みを実行すれば、PIC24でのLチカの出来上がりです。
mrbcは、mruby3.2対応の物を準備してください。はまりました。
メモリ 消費量について
ポーティング手順の時測った以来なので、やってみました。
mruby/c 手順書の時 PIC24 16bit | mruby/c3.2 PIC24 16bit | |
---|---|---|
RAM消費量(byte) | 5,304 | 2660 |
手順書の時を1とした比 | 1 | 0.50 |
約半分の消費量となっています。6割までは届きませんでしたが、上手に使えばかなり小さいメモリのPICでも実用になるのではないでしょうか。