硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2473|回复: 1
收起左侧

讨论一下STM32的HAL_Delay()防止溢出的可行性修改

[复制链接]

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2020-6-17 14:05:10 | 显示全部楼层 |阅读模式
如果产品连续运行时间超过这一定天数时,时间HAL库 systick 的__IO uint32_t uwTick;溢出问题.

__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)
//  {
//
//  }

  uint32_t timediffe;

  do{
          timediffe = HAL_GetTick();

          if(timediffe < tickstart)/*判断翻转*/
          {
                  wait = Delay - (HAL_MAX_DELAY - tickstart);/*计算剩余延时*/

                  while (HAL_GetTick() < wait)/*等待延时结束*/
                  {

                  }
                  break;
          }

  }while((timediffe - tickstart) < wait);

}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2020-6-17 14:16:37 | 显示全部楼层
这个没有溢出问题,这个是32bit无符号数求差的方式。
类似我这个:


QQ截图20200617141715.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 04:51 , Processed in 0.035947 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表