前回で無事にRaspberry Pi上でTOPPERSが動作するようになったので、今回からはμITRONについて、初心者向けに使い方や作り方などを説明していきたいと思います。
ITRONは2.0時代にバリバリ使っていましたが、それ以降はOSの深いところまで突っ込んだ開発はしていないので、ツッコミどころがあってもスルーしてください(^^;
また、ここでは、できるだけ「静的API」を推奨します。
組み込みの世界で「動的」は、リソースの開放漏れによるメモリ枯渇などの問題が発生しやすく、いつでも目の前にターゲット機器があって、問題が起きても簡単に再起動して復旧できるとは限らないので、リスクが高いというのが理由です。
TOPPERSの仕様書については、以下のリンク先を参照して下さい。
https://www.toppers.jp/documents.html#tgki_spec
ITRONにはとてもたくさんの機能があり、「サービスコール」を呼び出すことでカーネルに指示を与えることができます。
しかし、機能がたくさんありすぎて、どれを使ったら良いのか、その機能についてのメリットやデメリットを理解して使うのが難しいと思います。
そこで、今後は最低限必要だったり、使ったほうが良いもの、あまり使わないほうが良いものなどを説明していきたいと思います。
今回は「タスク」について説明していきたいと思います。
☆これは必須の機能です☆
「タスク」とはITRONの機能の一つです。
よくスレッドとの違いに悩んだりするかと思いますが、すごく大雑把に言いますと、スレッドはある単位の処理を複数並列に動作させたい場合に使う機能で、タスクは一つ一つの機能そのものがそれぞれタスクになる、といった感じでしょうか。
イマイチわかりにくいですね。
例えば画像変換アプリを作る場合、指定された複数のファイルの画像を同時に1/2に縮小したいとします。
その時に各処理に「ファイル名」を渡し、処理の中でファイルのオープン、リード、変換、出力をする。その時に使用するのが「スレッド」です。
ファイルの入出力には時間がかかり、ディスクのIO処理をしている間はCPUが暇になります。
その時に別のスレッドが縮小処理を実行し、無駄にCPUを待たせることなく処理が進行できます。
テレビを作ることを考えてみましょう。
最近のテレビは、地デジの視聴、番組の録画、録画した番組の再生・CMカットなどの編集、インターネットに接続してYouTubeの視聴などができます。
最近のテレビは機能てんこ盛りなので、とりあえず前に挙げた5つの機能だけあったとします。設定機能などは省略します。
それぞれの機能が「タスク」になります。
電源を入れるとテレビ視聴機能タスクが動作し、前回選択されていたチャンネルを選局し、画面に放送内容を表示してスピーカーから音声を再生します。
リモコンのYouTubeボタンを押すとYouTubeタスクに切り替わり、インターネットへの接続、YouTubeのトップページを画面に映し出します。
なんとなくイメージが掴めたでしょうか?
タスクはもっと細かく分割したりすることもあります。
分割する単位は、開発する対象の規模や構成によって柔軟に決定します。
ITRONが扱う処理単位の一つが「タスク」になります。
タスク関連で主に使用するサービスコールは以下のものです。
* CRE_TSK(タスクを生成する)
* act_tsk(タスクを起動する)
ext_tskも入れようか迷いましたが、組み込み機器は電源ぶつ切りにされることも多く、きれいに終了することが必ずしも必要ではないので省略しました。
それでは、タスクとは具体的にどのような作りになっていのか、簡単に説明しましょう。
void task(intptr_t exinf) { 前処理(); while (1){ イベント待ち(); /* ☆ */ タスクの処理(); } }
基本はこの形です。
必要があれば前処理をし、☆印を付けたイベント待ちをします。
イベントを受信したらタスクの処理をし、再びイベント待ちをします。
先程のテレビの例で言いますと、待っているイベントはリモコンのボタンを押された、というイベントだったりですね。
今回はタスクの概要について説明してみました。
次回もまた、ITRONについて説明をしていきたいと思います。
[…] 前回はタスクについて説明しました。 本当は実際の動作についても触れたかったのですが、PCのトラブルで文字での説明だけになってしまいました。 というわけで、今回はRaspberry Pi3で […]
[…] タスクの解説の際、以下のような簡単なソースコードを記載しました。 […]