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