モダンOSのお砂場(1) Mbed OS、スレッド、セマフォ、イベント、割り込み

RTOS(リアルタイム・オペレーティングシステム)などと言うと、とても敷居が高くて、準備するだけで数か月みたいなイメージをもっていたのですが、

モダンOS

では違うようです。今日も実働時間1時間もかからずに、何の知識もない状態から、4スレッド(一般のRTOSでは普通タスクと呼ぶけど)、セマフォにイベントフラグ、割り込みハンドラなど含めたRTOS(Ebed OS5)の練習プログラム、動いてしまいました。でも、いつもの調子で大慌てなドタバタもあったんであります。まあ、書いてみないと分からない。

※「モダンOSのお砂場」投稿順Indexはこちら

結構、よくばりなことに、以下のような「仕様」の練習プログラムを書くことにいたしました。

  1. メインのスレッド(タスク)は、子スレッドを起動した後、「伝統の」Lチカをやり続ける。
  2. 第1のスレッドは、1秒周期で、USBシリアルへ「俺(Thread1)だ」と言う。
  3. 第2と第3のスレッドは、1個のセマフォを共有していて、セマフォが取れた方が「俺だ」という。取れた方は1秒たったらセマフォを手放す。取れなかった方は、取れるまで寝ている。これを繰り返す。
  4. 第4のスレッドは、イベントフラグが到着するまで寝ていて、到着したら「俺だ」と言う。そしてまた寝る。
  5. 割り込みハンドラを一つ定義し、ユーザボタンを押したらイベントフラグたてて第4のスレッドを起こす。

こうして書くと結構複雑ですが、Ebed環境だと、ほんとお手軽、コーディングするのに30分もかかりません(ドキュメントと例題が充実しているお陰です。)ターゲットボードは、例によって NUCLEO-F072RBボードです。コンパイル成功。よし、ボードに書き込んで起動!

あれあれ、何ということでしょう。動きませぬ。メモリが足りないとのメッセージが。

NUCLEO-F072RBはRAMが16KB

生成したオブジェクトは、静的にはRAM10KB以下の使用だったのですが、流石RTOS(何がさすがだかわからないが)、動的に要求するメモリが足らなかったようです。そこで、とりあえず、動作するところまで機能を削ってみました。

メインと割り込みハンドラ、そしてイベント受けのスレッド4

再コンパイルしました。よし、起動。

ほらね、ボタンを押すと、スレッド4がちゃんと答えます。メインスレッドは、それとはかかわりなく、Lチカをやっている。OKですね。

では、次に簡単そうな、1秒定周期のスレッド1を復活させてみるか。

ダメでした。

やはり非力なF072RBでは、RTOSをグリグリ動かすというのには無理があるようです。そこで、F401REに登場願いました。こちらは

RAM96KB

です。Ebed OSのWebツールの右肩のターゲットボードのボタンを押して、ターゲットを交換、コンパイル!

あれあれ、コンパイルできないよ。

躓きました。

F072RBではOKだったソースなのになぜ? エラーレポート見て気付きました。

コンパイル じゃなくて 全てコンパイル

しないとイケなかったのです。ターゲットボードを交換したのだから、流石に下層のドライバ類は再コンパイル必要。その辺を隠してくれているEbedならではで、ついつい、見えているソースだけコンパイルを掛けてしまったための躓きでした。ボードに書き込みます。

固定周期のスレッド1が1秒おきにメッセージを送る途中、ボタンを押すと、割り込みハンドラが寝ているスレッド4を起こしています。

それでは、セマフォを奪い合う、スレッド2とスレッド3のコメントを外し、再コンパイル(今度は「全て」である必要はなし)いたします。

動かしたら、こんな感じ。

メインタスクのやっているLチカが見えないのがちと残念ですが、それぞれ、バラバラというか動きながらも、ちゃんとやり取りも行っていて、

RTOSしてますか?

という感じ。よかった。

 

 

モダンOSのお砂場(2) Micro:bit ちと調べてみた へ進む