搜索
123
返回列表 发新帖
楼主: 与龙共舞

[讨论] 质疑HAL库的延时函数HAL_Delay

  [复制链接]

该用户从未签到

40

主题

250

帖子

92

蝴蝶豆

金牌会员

最后登录
2024-4-19
 楼主| 发表于 2018-4-24 16:12:15 | 显示全部楼层
QQ截图20180424160715.png
回复 支持 反对

使用道具 举报

该用户从未签到

44

主题

647

帖子

163

蝴蝶豆

金牌会员

最后登录
2021-4-25
发表于 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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

初级会员

最后登录
2020-7-22
发表于 2018-8-9 09:51:57 | 显示全部楼层
2^32  /60s/60min/24h/365day = 136年 鉴定完毕。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

488

帖子

0

蝴蝶豆

金牌会员

最后登录
2022-4-16
发表于 2019-3-18 15:45:32 | 显示全部楼层
dsjsjf 发表于 2018-4-20 10:22
按照楼主所说,此时uwTick是220,那么uwTick会随着时间脉冲++,理论到320的时候解除死循环,
而在255的时候 ...

还是没从本质上明白,但我试了一下,无符号64-220,确实等于100
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2020-8-9
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2020-1-12
发表于 2019-6-10 09:47:05 | 显示全部楼层
toofree 发表于 2018-4-20 09:13
HAL_Delay()函数的参数类型是uint32_t,即无符号32位int型。
如果超过32位的最大数(4亿多4294967296)的话 ...

正解!确实存在uwTick变量累加到临界最大值导致出错隐患。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-2 11:10 , Processed in 1.183640 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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