組み込み技術を向上したい!!

でも組み込み以外にも手を出し始めました・・・

mbed-rtos(mbed osじゃないよ!)を使って、rtosを学んでみた

今まで組み込みOSはいろんな意味で避けてきたが、
mbedのすばらしさに気がついたので、
mbed rtosというものでいろいろ実験しながら勉強してみる。

STM32F429I-DISCO用のバイナリをmbedで作って、
ST-Link Utilityにて書き込むという手順でやってみる。

>mbed rtosに関してはドキュメントが充実しているので、
おそらく迷うことは無いだろう。

RTOS - Handbook | mbed


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

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----

sunnydays-k.hatenablog.com

 でもう少し勉強した。

----------