リアルタイムOSとはいえ、基本はHelloWorld。ということで、シリアルポートに 一定時間おきにHelloWorld.と出力するプログラムを作成してみます。 今回は以下の3つの機能を使います。
コンフィギュレーションファイルとは、ソフトウェアが使用するドライバや タスクなどのオブジェクトを定義するためのファイルです。 コンフィギュレーションファイルを基に、コンフィギュレータがカーネル構成ファイルや IDの割り当てなどを行うそうです。 下のコンフィギュファイルでは、タスク2つと周期ハンドラ1つを生成しています。 CRE_TSKというのがタスク生成API、CRE_CYCというのが 周期ハンドラの生成APIです。
//----------------------------------------------------------
// はじめてのTOPPERS
//----------------------------------------------------------
#define _MACRO_ONLY
#include "hello.h"
INCLUDE("\"hello.h\"");
CRE_TSK(MAIN_TASK, { TA_HLNG|TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
CRE_TSK(MSG_TASK, { TA_HLNG, 0, msg_task, MID_PRIORITY, STACK_SIZE, NULL });
CRE_CYC(CYCHDR1, { TA_HLNG, 0, cyclic_handler, 1000, 0 });
#include "../../systask/timer.cfg"
#include "../../systask/serial.cfg"
#include "../../systask/logtask.cfg"
| 値 | 意味 |
|---|---|
| TA_HLNG | タスクを高級言語用のインターフェースで起動します。 TA_ASMと同時に指定することはできません。 |
| TA_ASM | タスクをアセンブリ言語用のインターフェースで起動します。 TA_HLNGと同時に指定することはできません。 |
| TA_ACT | タスクを実行可能状態で起動させます。TA_ACTが指定されていない場合、 休止状態で起動されます。 |
| 値 | 意味 |
|---|---|
| TA_HLNG | タスクを高級言語用のインターフェースで起動します。 TA_ASMと同時に指定することはできません。 |
| TA_ASM | タスクをアセンブリ言語用のインターフェースで起動します。 TA_HLNGと同時に指定することはできません。 |
| TA_STA | 周期ハンドラ生成と同時に動作している状態にします。 |
| TA_PHS | 周期ハンドラ生成時の位相情報を保存します。 TOPPERSではサポートしていません。 |
タスクの優先度と各タスクに割り当てるスタックのサイズを適当に設定します。 スタックサイズを8192バイトにしていますが、今回のプログラムでは こんなに必要ないです。
#include <t_services.h> //---------------------------------------------------------- // 各タスクの優先度の定義 //---------------------------------------------------------- #define MAIN_PRIORITY 5 /* メインタスクの優先度 */ #define HIGH_PRIORITY 9 /* 並列に実行されるタスクの優先度 */ #define MID_PRIORITY 10 #define LOW_PRIORITY 11 #ifndef STACK_SIZE #define STACK_SIZE 8192 /* タスクのスタックサイズ */ #endif /* STACK_SIZE */ //---------------------------------------------------------- // 関数のプロトタイプ宣言 //---------------------------------------------------------- #ifndef _MACRO_ONLY extern void main_task(VP_INT exinf); extern void msg_task(VP_INT exinf); extern void cyclic_handler(VP_INT exinf); #endif /* _MACRO_ONLY */
#include <t_services.h>
#include <serial.h>
#include "kernel_id.h"
#include "hello.h"
//----------------------------------------------------------
// 周期イベント
//----------------------------------------------------------
void cyclic_handler(VP_INT exinf)
{
iact_tsk(MSG_TASK);
}
//----------------------------------------------------------
// メッセージ送信タスク
//----------------------------------------------------------
void msg_task(VP_INT exinf)
{
serial_wri_dat(2, "HelloWorld.\r\n", 31);
ext_tsk();
}
//----------------------------------------------------------
// メインタスク
//----------------------------------------------------------
void main_task(VP_INT exinf)
{
int temp = 0;
syslog( LOG_NOTICE, "Test program start.\r" );
serial_opn_por(2);
sta_cyc( CYCHDR1 );
while ( TRUE ) {
slp_tsk();
}
kernel_exit();
}