多定时器处理2(30天自制操作系统 -- 读书笔记)

     今天的内容依然来自《30天自制操作系统》这本书。

     1、中断处理程序存在的问题,中断处理程序Timer_Interrupt如下:

//定时器中断函数
void Timer_Interrupt(void)
{
    int i=0;
    timerctl.count ++;
    for(i=0;i<MAX_TIMER;i++)        //扫描所有的定时器
    {
        if(timerctl.timer[i].flag == TIMER_FLAG_USING)
        {
            timerctl.count--;
            if(timerctl.count == 0) //减得时间到了
            {
                fifo8_put(timerctl.timer[i].fifo,timerctl.timer[i].data);  //向关联fifo中写入数据
                timerctl.timer[i].flag = TIMER_FLAG_ALLOC;      //改变标志位
            }
        }
    }
    
    return ;
}

     每次中断程序中,都要将正在使用中的定时器(TIMER_FLAG_USING)的定时时间count读出来,然后再减一,为了避免这一点。可以做如下修改:
将count的含义由设定的倒计时时间,变为设定的准定时间。具体如下:

     修改timer_settime函数:

//设定timer定时器的定时时间为timeout
void timer_settime(struct TIMER* timer,unsigned int timeout)
{
    timer.timeout = timeout+timectl.count;   //这里!!     
    timer.flag = TIMER_FLAG_USING;  //这条语句相当于启动了定时器
    
    return ;
}

     定时器结构体中的count含义就是从现在开始,还有多久定时时间到。
     修改定时器中断程序Timer_Interrupt如下:

//定时器中断函数
void Timer_Interrupt(void)
{
    int i=0;
    timerctl.count ++;
    for(i=0;i<MAX_TIMER;i++)        //扫描所有的定时器
    {
        if(timerctl.timer[i].flag == TIMER_FLAG_USING)
        {
            if(timerctl.count >= timer[i].timeout) //count由设定时的值变到了设定的值
            {
                fifo8_put(timerctl.timer[i].fifo,timerctl.timer[i].data);  //向关联fifo中写入数据
                timerctl.timer[i].flag = TIMER_FLAG_ALLOC;      //改变标志位
            }
        }
    }
    
    return ;
}

     暂时OK。

原文地址:https://www.cnblogs.com/kanite/p/4485861.html