打印

DrvTIMER_Delay()存在Bug。

[复制链接]
2352|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天对DrvTIMER_Delay()函数作了一下测试,用的是官方最新的BSP M051SeriesBSP_CMSIS.ZIP + NuTiny-SDK-M051 + 逻辑分析仪。
测试结果如下:
DrvTIMER_Delay(0); //延时0ms,死在里面了!
DrvTIMER_Delay(1); //延时1ms,实际是2ms。
DrvTIMER_Delay(10); //延时10ms,实际是11ms。


打开该函数看到:
void DrvTIMER_Delay(E_TIMER_CHANNEL ch, uint32_t uIntTicks)
{
    uint32_t volatile btime;
    btime = DrvTIMER_GetIntTicks(ch);
    while (1)  <--?
    {
        if ((DrvTIMER_GetIntTicks(ch) - btime) > uIntTicks) <--???!!
        {
            break;
        }
    }
}

将   if ((DrvTIMER_GetIntTicks(ch) - btime) > uIntTicks)
改成 if ((DrvTIMER_GetIntTicks(ch) - btime) >= uIntTicks)
问题解决。
测试结果如下:
DrvTIMER_Delay(0); //有8~9us的延时,不会死在里面。
DrvTIMER_Delay(1); //延时1ms,实际是1ms。
DrvTIMER_Delay(10); //延时10ms,实际是10ms。




这个函数的写法感觉有点啰嗦。
改成如下更好:
void DrvTIMER_Delay(E_TIMER_CHANNEL ch, uint32_t uIntTicks)
{
    uint32_t volatile btime;
    btime = DrvTIMER_GetIntTicks(ch);
    while((DrvTIMER_GetIntTicks(ch) - btime) < uIntTicks);
}
测试效果同上。

测试程序如下:
#include "M051Series.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvTIMER.h"
int main()
{
  DrvTIMER_Init();
  DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);
  DrvTIMER_Open(E_TMR0, 1000, E_PERIODIC_MODE);     //每秒1000Tick,1ms/tick
  DrvTIMER_EnableInt(E_TMR0);
  DrvTIMER_Start(E_TMR0);
  while(1)
  {
    DrvTIMER_Delay (E_TMR0, 10);
    DrvGPIO_ClrBit (E_PORT3, E_PIN6);
    DrvTIMER_Delay (E_TMR0, 10);
    DrvGPIO_SetBit (E_PORT3, E_PIN6);
  }
}

天之蛟龙
2011-06-14

相关帖子

沙发
xiaoyh520| | 2011-6-15 15:00 | 只看该作者
:(

使用特权

评论回复
板凳
john_lee| | 2011-6-18 00:25 | 只看该作者
不错,非常有钻研精神,赞一个。

使用特权

评论回复
地板
hotpower| | 2011-6-18 12:13 | 只看该作者
图不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

84

帖子

1

粉丝