mruby/cで複数のtask
mruby/cでは複数のtaskを走らせることができる。 その機能を使ったことはこれまで無かったが、折角使えるので使い方を考えてみた。 私が構築しているシステムでは、mrbのコードはflashの特定のアドレス以降に書いておいて、そこを書き換えることによって、mrbだけを入れ替えることができるようにしている。 そこに複数のmrbコードを並べて、それらを読み込んで実行できるようにすれば良いだろう。 一つのmrbのすぐ後に、またmrbのコードがある場合には、それを次のtaskとして登録するようにするのである。 そのための関数は以下のように定義することができる。
void load_continuous_tasks(const uint8_t *start_addr) {
for (int i = 0; MAX_VM_COUNT > i ; i++) {
if (memcmp(start_addr, "RITE", 4) != 0) break;
mrbc_create_task(start_addr, 0);
start_addr += // big endian
((uint32_t)start_addr[8] << 24) |
((uint32_t)start_addr[9] << 16) |
((uint32_t)start_addr[10] << 8) |
((uint32_t)start_addr[11] );
}
}
試しに、GPIOを使うmrbと、printを使うmrbを同時に走らせてみたら、問題なく動いた。 変数などはそれぞれのtaskで独立のようだ。 グローバル変数を使うと、taskを越えて使えるそうだが、まだ試していない。 マイコンでマルチタスクを使ったことは無いので、どう使うと便利なのかも考えてみたい。