多定时器处理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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值