| 本帖最后由 Ryanhsiung 于 2011-10-14 19:06 编辑 
 关于回调函数,先前不一直看不懂,看了好几个例程,明白一点了。
 回调函数实质就是函数指针,指向的是中断执行的具体内容。不过不能直接替换中断函数,而是作为子程序的入口供中断函数调用。
 新唐CORTEC-M0  库文件中大量使用回调函数,可以方便做到多任务运行,且封装了底层。
 下面是T1的中断程序
 
 void TMR1_IRQHandler(void)
{
    int32_t i;
    
          TIMER1->TISR.TIF = 1;
    uTimer1Tick++;
         if (bIsSetTime1Event)                        /* Timer Event Handle */
    {
        for (i=0; i<TIMER_EVENT_COUNT; i++)                //这里就可以做到多任务
        {
            if (tTime1Event[i].active)   //任务是否激活
            {
                tTime1Event[i].curTick--;  //计数倒减
                if (tTime1Event[i].curTick == 0)
                {
                    (*tTime1Event[i].funPtr)(tTime1Event[i].transParam);//我门只需要设定函数指针即可调用相应函数
                    tTime1Event[i].curTick = tTime1Event[i].initTick;    //重装
                }
            }}
}
}
对板子的一些建议:
 1、文档不全,且有瑕疵,我现在看的文档就看到了3处以上的瑕疵,最好完善一下文档
 2、有些库函数还需要改进
 例:
 DrvGPIO_Open( E_D_GPLED1, D_PIN_LED1, E_IO_OUTPUT );
 
 //全部改成宏定义,方便移植
 DrvGPIO_Open( E_D_GPLED2, D_PIN_LED2, E_IO_OUTPUT );
 DrvGPIO_Open( E_D_GPLED3, D_PIN_LED3, E_IO_OUTPUT );
 DrvGPIO_Open( E_D_GPLED4, D_PIN_LED4, E_IO_OUTPUT );
 增加兼容性,若E_D_GPLED1,E_D_GPLED2,E_D_GPLED3,E_D_GPLED4 为同一端口
 最好可以这么操作    DrvGPIO_Open( E_D_GPLED1, D_PIN_LED1|D_PIN_LED2|D_PIN_LED3 |D_PIN_LED4 , E_IO_OUTPUT );
 
 
 3、库函数最好增加一些操作操作的宏定义(开总中断、关总中断、软件复位和喂狗等等)
 例: #define ClrWDT()
 { UNLOCKREG(); DrvWDT_Ioctl (E_WDT_IOC_RESET_TIMER,0); LOCKREG();}
 
 
 问题:
 今天用TIMER有一个问题,搞不懂
 DrvTIMER_Open(E_TMR0,1000,E_PERIODIC_MODE); // _PERIODIC_MODE 周期 模式
 第二个参数为1000(x) 代表1S / 1000 周期,为1/1周期. 变换关系为1s/X
 函数内部会将第二个参数给TCMPR ,即 TIMER0->TCMPR  =x。
 而 定时溢出周期= (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)
 问1:应该X越大,周期越长啊?
 问2:x 变换关系为什么是1S/X,怎么算出来的??
 
 第二个 MDK 中怎么使用内联函数,要怎么表示??
 inline void ClrWDT(void),我这么写不对啊!!
 |