mbed-rtos(mbed osじゃないよ!)を使って、rtosを学んでみた
今まで組み込みOSはいろんな意味で避けてきたが、
mbedのすばらしさに気がついたので、
mbed rtosというものでいろいろ実験しながら勉強してみる。
STM32F429I-DISCO用のバイナリをmbedで作って、
ST-Link Utilityにて書き込むという手順でやってみる。
>mbed rtosに関してはドキュメントが充実しているので、
おそらく迷うことは無いだろう。
mbed osというIotとかでセキュアな接続を確立することを目的としたOSがそのうちリリースされるらしいが、今は微妙な感じらしいので、とりあえずmbed rtosを選択した。
まずは基本から。
スレッドを作る
// スレッド用の関数(タスク)を準備する.
voidスレッド関数(void const *args) {
}
// スレッド用を作成する.(任意の場所で)
Thread thread(スレッド関数, (void*)"名前 ");
// 2016.2.28 編集
// どうやらポインタ使わず直接いじってもいいらしい。
// まぁ普通のことやね。
// Thread *(p_thre);
// p_thre = &thread; // スレッドをポインタで指させて、優先度を変更できる。
// p_thre->set_priority(osPriorityIdle); // set priority.
//default priority is osPriorityNormal.
thread.set_priority(osPriorityIdle); // みたいに 2016.2.28
Mutex
Mutexで処理をロックしたり、アンロックしたりする。
同時に同じ処理にアクセスさせないためだと思う。
Semaphore
Semaphoreで順番待ちさせる。
同時に同じ処理にアクセスさせないためだと思う。
Signals
Signalsでフラグ待ちさせる。
特定の条件で動くタスクとかに使いやすいのかな?
QueueとMemoryPool
QueueとMemoryPoolを使ってデータの受け渡しができる。
メモリ使用量とかわからんが、↓のMailの方が使いやすそう。
MailはQueueとMemoryPoolが一つになった様な感じで使いやすそう。
RTOS Timer
RTOS Timerまであるがpriorityはどんな感じだろう?
millisec単位なので、高速なタイマーとしては使えないと思う。
普通に定期処理させる内容を記述するときに使えばいいのかな?
Ticker
Ticker.attachはRTOSと共存でき、Ticker.attach_usでus対応しているので、
短い期間usオーダーの割り込みも作成可能。
しかし、3usとかで割り込みさせると他のタスクが動かないと思うので(何個かタスク作って動かしてみると4us以上だと良かった)、適度に調整する必要がある。
ちなみにTicker用の関数はMutexとかはしてはいけないらしい。
ものすごく簡潔に書いたが、mbedのオフィシャルのページを見れば詳細がわかる。
本当にシンプルで使いやすそうだ。
本来なら必要であろうポーティングの手間も無い。
Unbelievable!!
----追記 2016.04.03----
でもう少し勉強した。
----------