Time management
タイマ関連処理
タイムアウト待ち登録:TimerQへ登録
時間経過待ちタスクのリストへ登録する。待ち時間の短い順でソートされる。
void link_timer_q( tcb_type *tcb, uint16 time )
{
uint16 sum_time, time_z1;
tcb_type *scan;
que_type *tq;
DI;
tq = &TimerQ;
sum_time = 0;
scan = TimerQ.link;
time_z1 = scan->time;
while( scan != (tcb_type *)tq ) {
time_z1 = scan->time;
sum_time += time_z1;
if( sum_time > time ) {
break;
}
scan = scan->link;
}
if( sum_time > time ) {
time -= ( sum_time - time_z1 );
tcb->time = time;
scan->time = time_z1 - time;
} else {
tcb->time = time - sum_time;
}
tcb_link( tcb, scan );
EI;
}
タイムアウト待ち削除:TimerQへの登録抹消
時間経過待ちタスクのリストからTCBのリンクを削除する。
void unlink_timer_q( tcb_type *tcb )
{
que_type *tq;
tcb_type *next;
DI;
tq = &TimerQ;
next = tcb->link;
if( next != (tcb_type *)tq ) {
next->time += tcb->time;
}
tcb_unlink( tcb );
EI;
}
タイマ割込み処理(周期割込み)
TimerQに繋がれた先頭のTCBのtimeを減算する。time=0ならばタイムアウト待ちキューからTCBを削除し、実行待ちキューにTCBを追加する。
void timer_1ms_int( void )
{
tcb_type *tcb, *next;
que_type *tq, *rq;
rq = &ReadyQ;
tq = &TimerQ;
tcb = TimerQ.link;
if( tcb != (tcb_type *)tq ) {
(tcb->time)--;
while( tcb->time == 0 && tcb != (tcb_type *)tq ) {
next = tcb->link;
tcb->state = tcb->next_state;
tcb->trg = TRG_TIMEOUT;
tcb_unlink( tcb );
tcb_link( tcb, (tcb_type *)rq );
tcb = next;
}
}
}