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)
2^32/60s/60min/24h/365day = 136年 鉴定完毕。
dsjsjf 发表于 2018-4-20 10:22
按照楼主所说,此时uwTick是220,那么uwTick会随着时间脉冲++,理论到320的时候解除死循环,
而在255的时候 ...
还是没从本质上明白,但我试了一下,无符号64-220,确实等于100
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)
{
}
}
toofree 发表于 2018-4-20 09:13
HAL_Delay()函数的参数类型是uint32_t,即无符号32位int型。
如果超过32位的最大数(4亿多4294967296)的话 ...
正解!确实存在uwTick变量累加到临界最大值导致出错隐患。