リアルタイムふうOS>時間管理

<前      目次      次>

RTF-OS (RealTimeFoo OperatingSystem)


タイマ関連処理を下記に示す。

1.タイムアウト待ち登録: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;
}

2.タイムアウト待ち削除: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;
}

3.タイマ割込み処理(周期割込み)

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;
        }
    }
}

<前      目次      次>
2007/9/2 改訂4