[Cortex-M0技术交流] RyanHsiung学习第四贴, 回调函数、一些建议,还有一些疑问!

[复制链接]
 楼主| Ryanhsiung 发表于 2011-10-14 19:00 | 显示全部楼层 |阅读模式
本帖最后由 Ryanhsiung 于 2011-10-14 19:06 编辑

关于回调函数,先前不一直看不懂,看了好几个例程,明白一点了。         
回调函数实质就是函数指针,指向的是中断执行的具体内容。不过不能直接替换中断函数,而是作为子程序的入口供中断函数调用。
      新唐CORTEC-M0  库文件中大量使用回调函数,可以方便做到多任务运行,且封装了底层。
下面是T1的中断程序              
  1. void TMR1_IRQHandler(void)
  2. {
  3.     int32_t i;
  4.    
  5.           TIMER1->TISR.TIF = 1;

  6.     uTimer1Tick++;
  7.         if (bIsSetTime1Event)                        /* Timer Event Handle */
  8.     {
  9.         for (i=0; i<TIMER_EVENT_COUNT; i++)                //这里就可以做到多任务
  10.         {
  11.             if (tTime1Event[i].active)   //任务是否激活
  12.             {
  13.                 tTime1Event[i].curTick--;  //计数倒减
  14.                 if (tTime1Event[i].curTick == 0)
  15.                 {
  16.                     (*tTime1Event[i].funPtr)(tTime1Event[i].transParam);//我门只需要设定函数指针即可调用相应函数
  17.                     tTime1Event[i].curTick = tTime1Event[i].initTick;    //重装
  18.                 }
  19.             }}
  20. }
  21. }
        
对板子的一些建议:
      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),我这么写不对啊!!
 楼主| Ryanhsiung 发表于 2011-10-15 08:03 | 显示全部楼层
还有一个比较蛋疼的问题!

老是让我升级,点升级后还是这个状态!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
x181084431 发表于 2011-10-16 21:12 | 显示全部楼层
学习 顶!
 楼主| Ryanhsiung 发表于 2011-10-17 07:56 | 显示全部楼层
是自己没学好,昨天拿MDK的编译指南看了一下,inline 要写成__inline 就可以实现内联函数了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部