2012/05/12

組込み用RTOS作成(μITRON風)3

rot_rdqとdly_tskの実装

/****************************************************/
// タスクの優先順位の回転
// 次のタスクに制御権を渡す
/****************************************************/
void rot_rdq(void)
{
int i_oldtaskid;
i_oldtaskid = iCurrentTaskID; // 現在の実行タスク番号を保存
iCurrentTaskID++; // 次の実行タスク番号へ
if(iCurrentTaskID >= TASK_MAX) iCurrentTaskID = 0; // タスク数以上なら先頭タスクへ
dispatch(&TCB[i_oldtaskid].iSP, TCB[iCurrentTaskID].iSP); // ディスパッチ
}

説明するほどではないが、現在実行中のタスクのスタックポインタ保存先アドレスと次に実行するタスクのスタックポインタ値をdispatchの引数として渡している。

/****************************************************/
// 自タスクの遅延
// int dly_time 遅延時間(0~)
// 単位:TAU0チャンネル0のインターバル時間
// dly_time時間以上実行を一時停止する
/****************************************************/
void dly_tsk(int dly_time)
{
TCB[iCurrentTaskID].iWaitTime = dly_time + 1; // 待ち時間をセット
while(TCB[iCurrentTaskID].iWaitTime){ // 0になるまで待ち
rot_rdq();
}
}

こちらも説明するほどではないが、タスクコントロールブロックの待ち時間に遅延時間をセットしてその値が0になるまでrot_rdqして待っている。dly_timeに1を足しているのは、μITRONの仕様が「遅延時間以上待つこと」となっている為とdly_time=0の時でも1回はrot_rdqさせる為。

TCB[iCurrentTaskID].iWaitTimeのカウントダウンはこんな感じ。

__interrupt void MD_INTTM00(void)
{
/* Start user code. Do not edit comment generated here */
/****************************************************/
// タスクの待ち時間をカウントダウン
/****************************************************/
int i;
for(i = 0; i < TASK_MAX; i++){ // 全タスクをループ
if(TCB[i].iWaitTime > 0){  // 待ち時間ありなら
TCB[i].iWaitTime--; // カウントダウン
}
}
/* End user code. Do not edit comment generated here */
}

インターバルタイマ割り込み(TAU0のチャンネル0)を使用してタスク待ち時間をカウントダウンしている。

最後にmain関数でタスクの生成とRTOSのスタート

void main(void)
{
/* Start user code. Do not edit comment generated here */
cre_tsk(0, tsk_task0);
cre_tsk(1, tsk_task1);
cre_tsk(2, tsk_task2);
sta_TmRtos();
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}

タスク関数はμITRONと同じで無限ループにして、こんな感じで定義

void tsk_task0(void)
{
while(1){
P8.0 ^= 1; // LED0反転
rot_rdq();
}
}

void tsk_task1(void)
{
while(1){
P8.1 = 0; // LED1点灯
dly_tsk(200); // ms待ち
P8.1 = 1; // LED1消灯
dly_tsk(300); // ms待ち
}
}

void tsk_task2(void)
{
while(1){
P8.2 ^= 1; // LED2反転
dly_tsk(500); // ms待ち
}
}

シミュレータ実行画面はこんな感じ。

今回作成した、なんちゃってRTOSのソースファイルTMrtos.zipここからダウンロードできます。


0 件のコメント:

コメントを投稿