2016/08/24

[mbed]mbed OSはRTOSなのか?

しばらく前に、mbed OS 5がリリースされた。
今はもう5.1だが、メジャーバージョンアップだ。。。というか、OSの2と3を足して5らしい。

Introducing mbed OS 5 | mbed

 

FreeRTOSを調べていたので、そういえばmbed OSはRTOSなのだっけ?と気になった。
まあ、組み込みのOSでRTOSじゃなかったら、使うことは無さそうな気がするので、たぶんそうだろう。

リアルタイムオペレーティングシステム - Wikipedia
ここに列挙されているだけでもたくさんあるな。
私が使ったことがあるのは、わずかだ。

 

mbed OSはどうなのか調べようと思ったが、mbed blogの一番最初に「RTOS」と書いてある。
だから、RTOSなのだろう。


mbed OS | mbed

こちらを見ると、CMSIS-RTOS RTXをベースにしている、と書かれている。
元はCで書かれているので、C++でラッパされているのだろうか?
そうらしい

試しに、LED点滅サンプルをインポートした。

image

mbed-os」のようだ。
URLはgithubだったけど、移動したのかしら?

githubのReleasesは、こう。

image

コンパイラのリビジョンは、こう。

image

なので、今の私はmbed OS 5.1.2を使っているのだろう。

 

書いてあるソースは、こんだけ。

image

ビルドすると、こんなもの。

image

 

KeilとSTM32CubeF4を使って、RTXを使ったLED点滅サンプルを作ってみた。

Program Size: Code=7624 RO-data=552 RW-data=80 ZI-data=3344 

うーん、mbed OSは周辺機器制御の部分がリンク時でもそぎ落とせないのかな?
Keilで試したいところだが、このサイズだと無料版ではリンクできないのだ。

ARM-GCC版をexportさせようとしたけど、どうにもうまくいかない。
Code Sourcery版もダメだ。LPCXpressoはグレーアウトされてるし。


あー、今はmbed CLIというのがオフラインコンパイル手段としてあるのか。
でもなんか、説明が長いぞ。。。

また今度だな。


mbed OS 5.1風のThreadにすると、こういう書き方になりそうだ。

void task_led()
{
    while (true) {
        led1 = !led1;
        Thread::wait(500);
    }
}

int main() {
    Thread th;
   
    th.start(task_led);
    while (true) {}
}

Threadでwarningが出ていたから、気になったのだよ。
Thread.hはこうで「MBED_DEPRECATED_SINCE()」の定義を使うとwarningが出ていたようだ。
マクロでこういうことできるんだ。。。

コンストラクタで指定するのではなく、start()で指定してほしいらしい。
型のmbed::Callback<void()>がよくわからんのだが、引数無し、戻り値voidというシグネイチャという意味なのだろうか。

 

値を渡したい場合は、これでよいのかな。

void task_led(int *wt)
{
    int waittime = *wt;
    while (true) {
        led1 = !led1;
        Thread::wait(waittime);
    }
}

int main() {
    Thread th;

    int wt = 1000;
    th.start(&wt, task_led);
    while (true) {}
}

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。