高手给帮我看看这段定时中断程序,谢谢

yangushi   2007-4-6 16:58 楼主
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等等都是表达的什么意思,谢谢解答

回复评论 (1)

MaxBiosTimerEvent,它是系统允许的最大的定时器事件
BiosTimerEvent,这个是事件属性的具体个数
DoBiosEvent,这个允许事件的标志
bios_tick_run,这个是BIOS是否产生滴答信号标志

static struct{
        U16 cnt;//当前记数值
        U16 rld;//默认事件的实时值
        void (*proc)(U32);//定时结束要做的事,函数入口
}BiosTimerEvent[MaxBiosTimerEvent];//事件属性列表

具体代码我就不详加注释了,我给出大体的思路:
产生一个定时器中断的时候,先处理硬件实时器,然后更新所有的属性列表,如果列表中的相应的事件的定时时间足够了,那就执行给定的功能函数

这就实现了一个定时器的多路复用.
点赞  2007-4-6 23:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复