3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

mrubyファミリーAdvent Calendar 2023

Day 14

mruby/cを16bitPICでやってみた

Posted at

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周りの使い方が若干変わった程度でしょう。

main.c
#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 へ変更

vm_config.h
/* 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」を有効にしておきます。

alloc.c
#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でも実用になるのではないでしょうか。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?