与龙共舞 发表于 2018-4-24 16:12:15

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)

生非死惧 发表于 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现在已经改了
__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)
{
}
}

yuntian324 发表于 2019-6-10 09:47:05

toofree 发表于 2018-4-20 09:13
HAL_Delay()函数的参数类型是uint32_t,即无符号32位int型。
如果超过32位的最大数(4亿多4294967296)的话 ...

正解!确实存在uwTick变量累加到临界最大值导致出错隐患。
页: 1 2 [3]
查看完整版本: 质疑HAL库的延时函数HAL_Delay