你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

为HAL_Delay()正名

[复制链接]
tanic 提问时间:2018-4-20 14:01 /
本帖最后由 tanic 于 2018-4-20 14:36 编辑

HAL库提供的HAL_Delay()没有BUG!

库提供的
/*滴答中断中调用*/
__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;//为了保证HAL_delay  延时参数以ms为单位 默认配置 uwTickFreq=1
}
uint32_t HAL_GetTickPrio(void)
{
  return uwTickPrio;
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}
看上去似乎存在一个溢出bug
tickstart=0xfffffff6; wait=20;
当uwTick溢出变成0   表达式变成  (0-0xfffffff6)<21   (1-0xfffffff6)<21 .....  何时能退出循环


下面开始测试,cube生成代码   MDK环境 freertos
uint32_t a=UINT_FAST32_MAX-10;
void delay(uint32_t tim)
{
uint32_t tickstart = 0;
  tickstart = a;
tim += 1;
  while((a - tickstart) < tim)
  {
  osDelay(50);
  }
}

void StartDefaultTask(void const * argument)
{
  /* init code for USB_DEVICE */
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(200);
  delay(20);
  }
  /* USER CODE END StartDefaultTask */
}

/* StartTask02 function */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
a=UINT_FAST32_MAX-10;
  for(;;)
  {
  
    osDelay(100);
  a++;
  }
  /* USER CODE END StartTask02 */
}

实际进第一次入delay
a=0xfffffff6
退出delay时  
a=0x0b;


收藏 评论2 发布时间:2018-4-20 14:01

举报

2个回答
tanic 回答时间:2018-4-20 14:33:17
为了简单没有开定时器。
主要为了验证表达式  while((a - tickstart) < tim)
以后可以直接用HAL_Delay  不用担心啥问题

GKoSon 回答时间:2018-4-24 16:07:50
然而这是为什么呢?溢出回到0的时候依旧ok
keil无负数

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版