Top > TOPPERS >シリアルでHelloWorld.

シリアルでHelloWorld.

 リアルタイムOSとはいえ、基本はHelloWorld。ということで、シリアルポートに 一定時間おきにHelloWorld.と出力するプログラムを作成してみます。 今回は以下の3つの機能を使います。

コンフィギュレーションファイル

 コンフィギュレーションファイルとは、ソフトウェアが使用するドライバや タスクなどのオブジェクトを定義するためのファイルです。 コンフィギュレーションファイルを基に、コンフィギュレータがカーネル構成ファイルや IDの割り当てなどを行うそうです。 下のコンフィギュファイルでは、タスク2つと周期ハンドラ1つを生成しています。 CRE_TSKというのがタスク生成API、CRE_CYCというのが 周期ハンドラの生成APIです。

hello.cfg
//----------------------------------------------------------
//	はじめての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"

APIの説明

CRE_TSK タスク生成の静的API

CRE_TSK(ID tskid, {ATR tskatr, VP_INT exinf, FP task, PRI itskpri, SIZE stksz, VP stk});
tskatrに指定できる属性
意味
TA_HLNG タスクを高級言語用のインターフェースで起動します。 TA_ASMと同時に指定することはできません。
TA_ASM タスクをアセンブリ言語用のインターフェースで起動します。 TA_HLNGと同時に指定することはできません。
TA_ACT タスクを実行可能状態で起動させます。TA_ACTが指定されていない場合、 休止状態で起動されます。

CRE_CYC 周期ハンドラ生成の静的API

CRE_CYC(ID cycid, {ATR cycatr, VP_INT exinf, FP cychdr, RELTIM cyctim, RELTIM cycphs});
cycatrに指定できる属性
意味
TA_HLNG タスクを高級言語用のインターフェースで起動します。 TA_ASMと同時に指定することはできません。
TA_ASM タスクをアセンブリ言語用のインターフェースで起動します。 TA_HLNGと同時に指定することはできません。
TA_STA 周期ハンドラ生成と同時に動作している状態にします。
TA_PHS 周期ハンドラ生成時の位相情報を保存します。 TOPPERSではサポートしていません。

ヘッダファイル

 タスクの優先度と各タスクに割り当てるスタックのサイズを適当に設定します。 スタックサイズを8192バイトにしていますが、今回のプログラムでは こんなに必要ないです。

hello.h
#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 */

タスクの優先度

ソースファイル

hello.c
#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();
}