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

质疑HAL库的延时函数HAL_Delay  

[复制链接]
GKoSon 提问时间:2018-4-20 08:55 /
阅读主题, 点击返回1楼
收藏 2 评论25 发布时间:2018-4-20 08:55
25个回答
GKoSon 回答时间:2018-4-20 16:29:25
黑皮男 发表于 2018-4-20 13:41
这个肯定会出现溢出,但是可以参考linux中的实现方法。下面是我的代码,只不过改了些名字,实现是一样的。
...

所以你的这思路就是把U32提升到U64 再次降低出现溢出的可能吗?
黑皮男 回答时间:2018-4-20 18:14:49
与龙共舞 发表于 2018-4-20 16:29
所以你的这思路就是把U32提升到U64 再次降低出现溢出的可能吗?

不是,是无符号数和有符号数的问题。http://www.cnblogs.com/hfyinsdu/p/4600052.html

评分

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

查看全部评分

GKoSon 回答时间:2018-4-20 18:51:33
黑皮男 发表于 2018-4-20 18:14
不是,是无符号数和有符号数的问题。http://www.cnblogs.com/hfyinsdu/p/4600052.html

受教了受教了
XinLiYF 回答时间:2018-4-20 20:13:33
无符号的回环问题:(uint8_t)(0x00) - (uint8_t)(0xFF) = (uint8_t)(0x01)

这个是一个很好的例子:模仿kfifo实现的环形缓冲区

评分

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

查看全部评分

GKoSon 回答时间:2018-4-24 16:11:13
本帖最后由 与龙共舞 于 2018-4-24 16:13 编辑

测试了一下 Keil下面编译是没有负数的
0-0xff=0X01
QQ截图20180424160715.png
GKoSon 回答时间:2018-4-24 16:12:15
QQ截图20180424160715.png
tanic 回答时间:2018-4-24 17:27:58
C代码       
uint8_t a,b;
uint8_t c;
a=0xff;
b=1;
c = b-a;
osDelay(c);

反汇编
MOVS r4,0xff
MOVS r6,0x01
SUBS r0,r6,r4
UXTB r5,r0
MOV r0,r5
BL.W osDelay(0x08003186)

评分

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

查看全部评分

生非死惧 回答时间:2018-8-9 09:51:57
2^32  /60s/60min/24h/365day = 136年 鉴定完毕。
zengyi703-16313 回答时间:2019-3-18 15:45:32
dsjsjf 发表于 2018-4-20 10:22
按照楼主所说,此时uwTick是220,那么uwTick会随着时间脉冲++,理论到320的时候解除死循环,
而在255的时候 ...

还是没从本质上明白,但我试了一下,无符号64-220,确实等于100
azhea 回答时间:2019-4-30 20:43:06
ST现在已经改了
  1. __weak void HAL_Delay(uint32_t Delay)
  2. {
  3.   uint32_t tickstart = HAL_GetTick();
  4.   uint32_t wait = Delay;

  5.   /* Add a freq to guarantee minimum wait */
  6.   if (wait < HAL_MAX_DELAY)
  7.   {
  8.     wait += (uint32_t)(uwTickFreq);
  9.   }

  10.   while ((HAL_GetTick() - tickstart) < wait)
  11.   {
  12.   }
  13. }
复制代码
yuntian324 回答时间:2019-6-10 09:47:05
toofree 发表于 2018-4-20 09:13
HAL_Delay()函数的参数类型是uint32_t,即无符号32位int型。
如果超过32位的最大数(4亿多4294967296)的话 ...

正解!确实存在uwTick变量累加到临界最大值导致出错隐患。
12

所属标签

相似问题

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