SSブログ

デバックモニタ上で動かすサンプルアプリケーションの作成 [HOS]

※デバックモニタ上で動かす事を前提にアプリケーションを作成しますので、幾つか手抜きのところが有ります。このままではROM上での動作はできません。


まずはコンフィギュレーション情報ファイル"system.cfg"の編集です。

/* HOS 独自の設定 */
HOS_IDL_STK(256,NULL);  /*IDEL時のスタック領域*/
HOS_INT_SP(0);  /*割込み時のスタックの初期値*/
HOS_MAX_TPRI(8);  /* 最大優先度(省略時 16) */
/*HOS_KERNEL_HEAP(8192);*/  /* カーネルヒープの設定(省略時 0):動的になんかを生成する時、このオプションを有効 */
HOS_TIM_TIC(1,1);  /* タイムティックの設定(省略時 1/1 ) */
HOS_MIN_INTNO(64);  /* 割り込み番号の最小値(省略時 0) */
HOS_MAX_INTNO(192);  /* 割り込み番号の最大値(省略時 0) */
/*HOS_MAX_MBXID(16);*/  /* メールボックスの最大値(省略時 0):静的に生成する二つと、動的に生成する分 */
/*HOS_MAX_TSKID(16);*/  /* 最大タスクID番号(省略時静的生成に必要なだけ) */
/*HOS_MAX_CYCID(4);*/  /*周期ハンドラの最大値*/
/*HOS_MAX_SEMID(8);*/  /*セマの最大数、省略時は必要なだけ*/
/*HOS_MAX_FLGID(4);*/  /*フラグの最大数、省略時は必要なだけ*/
/*HOS_MAX_DTQID(4);*/  /*データーキューの最大数、省略時は必要なだけ*/
/*HOS_MAX_MBFID(4);*/  /*メッセージバッファの最大数、省略時は必要なだけ*/

/* インクルードファイルの指定 */
INCLUDE("\"sample01.h\"");

/* 初期化ルーチンの追加 */
ATT_INI({TA_HLNG, 0, CMT0_Init});
ATT_INI({TA_HLNG, 0, Initialize});

/* 割り込みハンドラ */
ATT_ISR({TA_HLNG, 0, 144, CMT0_Int});	/**/

/* タスク */
CRE_TSK(TID_TSK1,	{TA_HLNG | TA_ACT, 1, tasks, 1, 1024,NULL});	/**/
CRE_TSK(TID_TSK2,	{TA_HLNG | TA_ACT, 2, tasks, 1, 1024,NULL});	/**/
CRE_TSK(TID_TSK3,	{TA_HLNG | TA_ACT, 3, tasks, 1, 1024,NULL});	/**/
CRE_TSK(TID_TSK4,	{TA_HLNG | TA_ACT, 4, tasks, 1, 1024,NULL});	/**/

/* セマフォ */
CRE_SEM(SEMID_SCI1, {TA_TFIFO, 1, 1});	/*SCI1の競合を避ける*/

コメントアウトされた所は、一番最初のビルド手順の「PreConfigure」で削除されます。
幾つかポイントが有りますが、
1.システムタイマーの更新は1msである。
2.割込み要因としてCMT0割込みのみ発生する。これはシステムタイマーの更新に使います。
3.4つのタスクを生成する。しかし起動関数は全て同じである。
4.一つのセマフォを生成する。バイナリセマフォとして利用します。

ソースコードは以下の様になります。

#include  <machine.h>
#include  <ctype.h>
#include  "iodefine.h"
#include  "itron.h"
#include  "kernel.h"
#include  "kernel_id.h"
#include  "sample01.h"

#if 0
#include <stdio.h>
#else
#define  printf  ((int (*)(const char *,...))0x000057e0)
#endif

/*************************************************************************/
/*	各種定義															 */
/*************************************************************************/
#define  __CPU_CLOCK__  50000000UL
#define  __PERIPHERAL_CLOCK__  25000000UL

/* タイマー周期定義 */
#define  TIM_1ms  (((__PERIPHERAL_CLOCK__ / 8) / 1000) - 1)
/* SCI通信速度定義 */
#define  SCI_38400  ((((((__PERIPHERAL_CLOCK__ * 2) / 32) / 38400) + 1) / 2) - 1)

/*************************************************************************/
/*	バスの初期化関数													 */
/*************************************************************************/
void BusInit( void )
{
}

/*************************************************************************/
/*	メイン関数															 */
/*************************************************************************/
int main()
{
	/* HOS-V4 の開始 */
	sta_hos();

	return 0;
}

/*************************************************************************/
/*	初期化処理関数														 */
/*************************************************************************/
void Initialize(VP_INT exinf)
{
}

/*************************************************************************/
/*	タスクサンプルプログラム											 */
/*************************************************************************/
void tasks( VP_INT tid )
{
	SYSTIM	present_time;

	while( 1 )
	{
		get_tim( &present_time );
		wai_sem( SEMID_SCI1 );
		printf( "Task ID =%d SYSTEM TIMER = %u\n",
			tid, present_time.ltime );
		sig_sem( SEMID_SCI1 );
		dly_tsk( 1000 );
	}
}

/********************************************************************/
/*	システムタイマー初期化処理										*/
/*	周期は1msとしておく												*/
/********************************************************************/
void CMT0_Init( void )
{
	/*モジュールスタンバイの解除を行う*/
	MST.CR2.BIT._CMT = 0;

	/* タイマ初期化 */
	CMT0.CMCSR.WORD = 0x0040;
	CMT0.CMCOR = TIM_1ms;
	CMT.CMSTR.WORD  = 0x0001;
	INTC.IPRG.BIT._CMT0 = 2;	/*優先度設定*/
}

/********************************************************************/
/*	システムタイマー												*/
/********************************************************************/
void CMT0_Int( VP_INT exinf )	/* OSタイマ用ハンドラ */
{
	CMT0.CMCSR.BIT.CMF = 0;
	isig_tim();		/* タイムティックの供給 */
}

※ハードウエアの設定はCMT0のみしか行っていませんが、本当はバスの初期化やSCIの初期化等、当然必要となってきます。

※HEWのウイザードを使用してアプリケーションを作成していきますが、途中で作成するか聞いてくるベクターファイルやHEAP領域は必要有りません。
Cランタイムルーチンやベクターテーブルはこちらで用意したものを使います。

※サービスコールの詳細は、下記のリンクの本か、μITRON4.0仕様書を参照して下さい。

次回はビルドフェーズの追加です。

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。