前回はタスクについて説明しました。
本当は実際の動作についても触れたかったのですが、PCのトラブルで文字での説明だけになってしまいました。
というわけで、今回はRaspberry Pi3での動きを見ながらタスクについておさらいしたいと思います。
その前に…、タスクを増やしたり減らしたりってどうやってやるの?という疑問があると思いますので、その点を簡単に説明します。
TOPPERS(に限らずITRON全般的に)は「コンフィギュレータ」というツールを使用してリソース(タスクやイベントフラグなど)をいくつ使用するかを定義します。
実際に、asp3/sample/sample1.cfgを見てみましょう。
/* * サンプルプログラム(1)のシステムコンフィギュレーションファイル * * $Id: sample1.cfg 705 2016-03-29 14:16:41Z ertl-hiro $ */ INCLUDE("tecsgen.cfg"); #include "sample1.h" CRE_TSK(TASK1, { TA_NULL, 1, task, MID_PRIORITY, STACK_SIZE, NULL }); CRE_TSK(TASK2, { TA_NULL, 2, task, MID_PRIORITY, STACK_SIZE, NULL }); CRE_TSK(TASK3, { TA_NULL, 3, task, MID_PRIORITY, STACK_SIZE, NULL }); CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL }); CRE_TSK(EXC_TASK, { TA_NULL, 0, exc_task, EXC_PRIORITY, STACK_SIZE, NULL }); CRE_CYC(CYCHDR1, { TA_NULL, { TNFY_HANDLER, 0, cyclic_handler }, 2000000, 0 }); CRE_ALM(ALMHDR1, { TA_NULL, { TNFY_HANDLER, 0, alarm_handler }}); #ifdef INTNO1 CFG_INT(INTNO1, { INTNO1_INTATR, INTNO1_INTPRI }); CRE_ISR(INTNO1_ISR, { TA_NULL, 0, INTNO1, intno1_isr, 1 }); #endif /* INTNO1 */ #ifdef CPUEXC1 DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler }); #endif /* CPUEXC1 */
上記がサンプルプログラムのシステムコンフィギュレーションファイルです。
前回簡単に説明した「CRE_TSK」が使用されているのがわかります。
main_taskは最初に動かしたいタスクであるため、タスク属性にTA_ACTを指定して実行可能状態になるように設定されています。
(ITRONの詳しい仕様はこちらを御覧ください。)
それ以外のタスクはmain_taskや例外ハンドラから動作させたいため、TA_NULLを指定して休止状態でタスクの生成を行っています。
それでは、main_task以外のタスクを実行可能状態にしている箇所を見てみましょう。
asp3/sample/sample1.cの抜粋は以下の通りです。
/* * メインタスク */ void main_task(intptr_t exinf) { char c; ID tskid = TASK1; int_t tskno = 1; : /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); :
とりあえずTASK1〜TASK3を実行可能状態にしている箇所のみです。
こちらも前回触れた「act_tsk」を使用して実行可能状態にしています。
サンプルプログラムを見てみると、このように3つのメインではないタスクが動作しているのがわかります。
また、シリアルからのキー入力でそれらをある程度コントロールすることも可能なようです。
そこで、今回はプログラムはそのままでサンプルプログラムをコントロールすることで動作確認としたいと思います。
その2で動作する環境を作ったので、それをそのまま使用します。
※ちなみに、今回あらためてビルドし直したらrubyで問題が出て、その解決方法をその2に追記しました。
プログラム実行中に「e」のキーを押すと、task1が終了してtask2に切り替わるようです。
実際にやってみたのが、以下のスクリーンショットになります。
ちなみに、標準のソースのままRaspberry Pi3で動かすとログの流れが早すぎるようです。
その際は asp3/target/rp3_gcc/target_test.h のTASK_LOOPの値を大きくしてビルドしなおせば良いようです。
私は頭に4を付けて4300000にしてみたところ、早すぎず遅すぎずでちょうどいい感じでした。
他にどんなことができるのか、ソースを見て実験してみて下さい。
それではまた。