TOPPERS/ASP3をシミュレータで動かす & タスクを実装する

最近公開されたTOPPERS/ASP3については、Mac OS Xでのシミュレーション環境がいち早く公開されている。今回はそのビルド・実行方法と、簡易的なタスクの実装方法についてまとめる。

シミュレータの実行

ダウンロード

以下から「Mac OS Xシミュレーション環境簡易パッケージ」をダウンロード、解凍
TOPPERSプロジェクト/ASP3カーネル

環境構築

ダウンロードフォルダ中の「doc/user.txt」に必要な環境が記述されている。
基本的に以前のTOPPERS/ASPと同じ環境を使う。これについては公式・非公式ともにわかりやすい解説が複数あるので、今回は割愛する。
ただ一点だけ、TOPPERS/ASPからの変更点として、コンフィギュレータがrubyスクリプトになっているので、rubyの実行環境が必要になる。

ビルド、実行

ダウンロードフォルダで以下を実行する。

mkdir OBJ
cd OBJ
ruby ../configure.rb -T macosx_xcode
make

するとOBJフォルダ内に「asp」という実行ファイルが生成される。これを実行するとサンプル・アプリケーションを実行するシミュレーション環境が動く。

タスクの実装

今回はデフォルトの環境に簡単なタスクを追加する。
具体的には「task_hoge」「task_highlevel_hoge」という2つのタスクを用意。task_hogeからより優先度の高いtask_highlevel_hogeをウェイクアップする処理を追加する。

タスク本体の実装

まずタスクの実装を用意。sampleフォルダのsample1.cに以下を記述

void task_hoge(intptr_t exinf)
{
    while (true) {
        slp_tsk();
        syslog(LOG_INFO, "hoge");
        wup_tsk(TASK_HIGH_HOGE);
        syslog(LOG_INFO, "hoge end");
    }
}

void task_highlevel_hoge(intptr_t exinf)
{
    while (true) {
        slp_tsk();
        syslog(LOG_INFO, "high hoge");
        syslog(LOG_INFO, "high hoge end");
    }
}

sample1.hに以下のプロトタイプ宣言を追加。

extern void task_hoge(intptr_t exinf);
extern void task_highlevel_hoge(intptr_t exinf);

コンフィギュレータによるタスク設定コード生成

sampleフォルダのsample1.cfgに以下の記述を追加

CRE_TSK(TASK_HOGE, { TA_NULL, 10, task_hoge, HIGH_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(TASK_HIGH_HOGE, { TA_NULL, 11, task_highlevel_hoge, HIGH_PRIORITY - 1, STACK_SIZE, NULL });

冒頭で作成したOBJフォルダにて、ターミナルで以下を実行してタスク設定コードを更新する。

ruby ../configure.rb -T macosx_xcode

タスク呼び出し部分の実装

sample1.cのmain_task関数内のタスク起動部の記述に、以下のタスクを起動する記述を追加。

act_tsk(TASK_HOGE);
act_tsk(TASK_HIGH_HOGE);
wup_tsk(TASK_HOGE);

なお既存コードに今回の追加を行うとtask関数内で不正なメモリアクセスが発生するけれど、追加部分の実行に支障はないのでそのままとする(graph配列への参照部分にガード条件を追加すれば抑止できる)。

ビルド、実行

ターミナルで以下を実行。

make
./asp

するとアプリケーション起動時に以下のログ出力が追加で表示されるようになる。実装通り、「task_hogeが、より優先度の高いtask_highlevel_hogeを呼び出す→task_hogeに復帰する」という動作が行われていることがわかる。

(略)
System logging task is started.
Sample program starts (exinf = 0).
hoge
high hoge
high hoge end
hoge end
(略)