1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windowsシミュレータで学ぶuITRON (5) - 周期ハンドラ

Posted at

はじめに

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)

定期的にSendTaskCyclic 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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?