mruby/cの特徴として、複数のmrubyプログラムを同時実行することができることがあげられます。
これを試してみます。

目標

  • 複数のmrubyプログラムを同時に動かし、協調動作をさせる。
  • コンソールを有効にする。

複数のmrubyプログラムを同時に動かし、協調動作をさせる

mrubyプログラムの用意とコンパイル

今までsample1.rbの中でプッシュスイッチの状態を見ていましたが、これをsample2.rbの仕事にして、sample2.rbからsample1.rbへグローバル変数で情報を伝えるようにします。

sample1.rbの10行目付近を、以下のように変更します。


if $sw1 == 0
  led = 1

sample2.rbを新規作成します。


while true
  $sw1 = sw1_read()
end

main.c プログラムの変更

#include <project.h>
#include "mrubyc.h"
#include "sample1.c"
#include "sample2.c"    // 追加

(中略)

  mrbc_create_task( sample1, 0 );
  mrbc_create_task( sample2, 0 );   // 追加
  mrbc_run();

ビルドと実行

  • メニューから、 Build > Build Design01 を選びます。
  • Output欄へ、「--------------- Build Succeeded: ...」と表示されるのを確認します。
  • デバイスをUSBポートへ接続します。
  • メニューから Debug > Program を選択します。
  • Output欄へ、「Device 'PSoC 5LP CY8C5888LT*-LP097' was successfully programmed at ...」と表示されるのを確認します。
  • デバイス上でLED1(青色)が点滅し、プッシュスイッチ SW1を押すと点いたまま消灯しなくなる動作を確認します。

コンソールを有効にする

mruby/cランタイムがエラーを検出したとき、コンソールがあるとそこにメッセージが表示されます。 また、古典的なデバッグ方法であるprintfデバッグをする場合も、利用方法が共通化されたコンソールがあることが望ましいです。

準備

シリアルが扱えるターミナルエミュレータソフトが必要です。 たとえば、TeraTerm (https://ttssh2.osdn.jp)等があげられます。 ダウンロードして、インストールしておきます。

回路の追加

  • 画面左 Workspace Explorerペインから、TopDesign.cyschをダブルクリックして、回路図を画面に表示させます。
  • 画面右 ComponentCatalog ペインから、Communications > UART をドラッグし、中央のペインへドロップします。
     20170116180311

画面左 Workspace Explorerペインの Pins をダブルクリックしてピンアサイン画面を表示します。 (表示されていない場合は、Project > Design Wide Resource 下にあるので、順に展開する)

右ペインの Port欄を以下のように設定します。

 20170116173705

Rx_1 P12[6]
Tx_1 P12[7]

main.c プログラムの変更

追加した回路を、mruby/cのコンソールに割り当てるコードを追加します。 hal_write関数がそれにあたりますが、今までダミーの関数を置いていたので、それを以下のコードと置き換えます。

int hal_write(int fd, const void *buf, int nbytes)
{
  UART_1_PutArray( buf, nbytes );
  return nbytes;
}

また、main関数内へ初期化コードを追加します。

int main()
{
  CyGlobalIntEnable; /* Enable global interrupts. */
  mrbc_int(memory_pool, MEMORY_SIZE)
  isr_1_StartEx(isr_1);
  UART_1_Start();   // 追加

mrubyプログラムの修正

sample1.rbで、LED表示状態をコンソールにも出力するように追加します。

  led1_write( led )
  puts led           # 追加
  sleep 0.2
end


ビルド

  • メニューから、 Build > Build Design01 を選びます。
  • Output欄へ、「--------------- Build Succeeded: ...」と表示されるのを確認します。
  • デバイスをUSBポートへ接続します。
  • メニューから Debug > Program を選択します。
  • Output欄へ、「Device 'PSoC 5LP CY8C5888LT*-LP097' was successfully programmed at ...」と表示されるのを確認します。

動作確認

ターミナルソフトを起動し、COM番号をターゲットボードに合わせます。画面はTeraTermのものです。

 20170116175925

また、ボーレートを、57600に設定します。TeraTermでは設定>シリアルポートから設定します。

ターミナルソフト上で、LEDの点滅に合わせて0と1が交互に表示され、プッシュスイッチを押すと1の表示だけになることを確認します。

 20170116180148