RTOS(リアルタイム・オペレーティングシステム)などと言うと、とても敷居が高くて、準備するだけで数か月みたいなイメージをもっていたのですが、
では違うようです。今日も実働時間1時間もかからずに、何の知識もない状態から、4スレッド(一般のRTOSでは普通タスクと呼ぶけど)、セマフォにイベントフラグ、割り込みハンドラなど含めたRTOS(Ebed OS5)の練習プログラム、動いてしまいました。でも、いつもの調子で大慌てなドタバタもあったんであります。まあ、書いてみないと分からない。
※「モダンOSのお砂場」投稿順Indexはこちら
結構、よくばりなことに、以下のような「仕様」の練習プログラムを書くことにいたしました。
- メインのスレッド(タスク)は、子スレッドを起動した後、「伝統の」Lチカをやり続ける。
- 第1のスレッドは、1秒周期で、USBシリアルへ「俺(Thread1)だ」と言う。
- 第2と第3のスレッドは、1個のセマフォを共有していて、セマフォが取れた方が「俺だ」という。取れた方は1秒たったらセマフォを手放す。取れなかった方は、取れるまで寝ている。これを繰り返す。
- 第4のスレッドは、イベントフラグが到着するまで寝ていて、到着したら「俺だ」と言う。そしてまた寝る。
- 割り込みハンドラを一つ定義し、ユーザボタンを押したらイベントフラグたてて第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してますか?
という感じ。よかった。