からくりブログ

株式会社からくり社員のブログです

Raspberry Pi 3 + μITRON その4(タスクその2)

前回はタスクについて説明しました。
本当は実際の動作についても触れたかったのですが、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にしてみたところ、早すぎず遅すぎずでちょうどいい感じでした。

他にどんなことができるのか、ソースを見て実験してみて下さい。
それではまた。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>