はじめに
uITRON(FreeRTOSベース)Windowsシミュレータ - Qiita
https://qiita.com/imagou/items/42c687402e6e58fccddb
今回のお題は、タイマ機能の一つである、周期ハンドラです。
本編
1. 環境
こちらの記事を参照ください。
2. 動かしてみる
2-1. 周期ハンドラの開始
コンソールで「cyclic」と入力してみましょう(入力後にEnterを押してください)。
[TimerTask]: DELAY 3000ms
[TimerTask]: DELAY 3000ms
cyclic
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (1)
[TimerTask]: DELAY 3000ms
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (2)
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (3)
定期的にSendTask
がCyclic Timer Expired (n)
を受信するようになりました(カッコ内の数値は満了回数)。
2-2. 周期ハンドラの停止
次に、コンソールで再度「cyclic」と入力してみましょう。
[SendTask]: RECV EVENT (00000001)
[SendTask]: Cyclic Timer Expired (10)
cyclic
[TimerTask]: DELAY 3000ms
[TimerTask]: DELAY 3000ms
前述の定期的なイベントが発生しなくなっています。
3. 解説
3-1. 概要
周期ハンドラは、その名の通り、定周期で何らかの処理を実施する仕組みです。
組み込みで言えば、定期的にデバイスの状態を監視する・・・などでしょうか。
3-2. コードによる説明
以降は、プログラムコード - main.c
を引用して説明します。
3-2-1. 周期ハンドラ生成
cre_cyc()
で生成します。
T_CCYC ccyc;
ccyc.cycatr = TA_HLNG;
ccyc.cychdr = UserCyclicHandler;
ccyc.cyctim = 1000;
ccyc.cycphs = 0;
cre_cyc(CYCLIC_ID(USER), &ccyc);
このパラメータは下表:
パラメータ番号 | 名称 | 説明 |
---|---|---|
第1パラメータ | 周期ハンドラID | 単なるID。 以降はこのIDでもって開始・停止を実施。 |
第2パラメータ | T_CCYC構造体変数 | 下表で説明。 |
T_CCYCのメンバは下表:
名称 | 指定可能な値 | 説明 |
---|---|---|
cycatr | ( TA_HLNG | TA_STA ) | 属性。 それぞれ、高級言語を使用、即開始するか。 |
cychdr | void func(void*) | 満了時に呼び出すハンドラ関数。 |
cyctim | ミリ秒 | ミリ秒単位の周期。 |
cycphs | ミリ秒 | 起動位相(開始時に遅延する時間)。本シミュレータでは(FreeRTOSが非対応のため)使えません・・・。 |
※なお、属性はこれ以外の値も指定可能(だが、上記のみで必要十分と考える)。
3-2-2. 周期ハンドラ開始・停止
それぞれsta_cyc()
、stp_cyc()
を使います。
/* Cyclic */
else if (EQUALS_(cyclic)) {
T_RCYC rcyc;
ref_cyc(CYCLIC_ID(USER), &rcyc);
if (!(rcyc.cycstat)) sta_cyc(CYCLIC_ID(USER));
else stp_cyc(CYCLIC_ID(USER));
}
またref_cyc()
を用い、周期ハンドラが起動しているか参照していますが、こちらの説明は割愛。
3-2-3. ハンドラ関数
ハンドラは非タスクコンテキスト、すなわち割り込みから呼ばれるので、簡潔な処理に留めます。
(超重要なので太字にしました、笑)
今回はまさしく定石手段、イベントフラグを立てて終了としています。
static void UserCyclicHandler(void* params)
{
/* Just to remove compiler warning. */
(void)params;
iset_flg(FLAG_ID(SEND), EVENT_CYCLIC);
}
おわりに
同じタイマ機能として、ワンショットを実現するアラームハンドラがありますが、次回紹介予定です。
参考
Micro-ITRON4.0 Specification (in Japanese)
http://www.ertl.jp/ITRON/SPEC/mitron4-j.html