static U8 sCLKDIVN, SlowMode;
static U8 chg_os_timer, os_timer_run, chg_bios_timer, bios_timer_run;
static U16 os_timer_rld, bios_timer_rld;
static U16 Timer4Cnt, Timer4Freq;
static U16 DoBiosEvent;
static struct{
U16 cnt;
U16 rld;
void (*proc)(U32);
}BiosTimerEvent[MaxBiosTimerEvent];
static U16 bios_tick_run = 0;
static U32 bios_tick_cnt;
static __irq void ISR_Timer3(void)
{
U32 i;
register r;
// ClearPending(BIT_TIMER3);
rSRCPND = BIT_TIMER3;
rINTPND = BIT_TIMER3;
r = rINTPND;
if(chg_bios_timer) {
chg_bios_timer = 0;
rTCNTB3 = bios_timer_rld;
rTCON &= 0xfff0ffff;
rTCON |= 0x000b0000;
rTCON &= 0xfffdffff;
}
bios_tick_cnt++;
bios_tick_cnt++
for(i=0; i
if(BiosTimerEvent.proc) {
BiosTimerEvent.cnt--;
if(!BiosTimerEvent.cnt) {
BiosTimerEvent.cnt = BiosTimerEvent.rld;
(*BiosTimerEvent.proc)(i);
}
}
}
if(!(DoBiosEvent||bios_tick_run)) {
bios_timer_run = 0;
DisableIrq(BIT_TIMER3);
}
}
我不明白程序中的MaxBiosTimerEvent,BiosTimerEvent,DoBiosEvent,bios_tick_run等等都是表达的什么意思,谢谢解答
MaxBiosTimerEvent,它是系统允许的最大的定时器事件
BiosTimerEvent,这个是事件属性的具体个数
DoBiosEvent,这个允许事件的标志
bios_tick_run,这个是BIOS是否产生滴答信号标志
static struct{
U16 cnt;//当前记数值
U16 rld;//默认事件的实时值
void (*proc)(U32);//定时结束要做的事,函数入口
}BiosTimerEvent[MaxBiosTimerEvent];//事件属性列表
具体代码我就不详加注释了,我给出大体的思路:
产生一个定时器中断的时候,先处理硬件实时器,然后更新所有的属性列表,如果列表中的相应的事件的定时时间足够了,那就执行给定的功能函数
这就实现了一个定时器的多路复用.