为HAL_Delay()正名
本帖最后由 tanic 于 2018-4-20 14:36 编辑HAL库提供的HAL_Delay()没有BUG!
库提供的
/*滴答中断中调用*/
__weak void HAL_IncTick(void)
{
uwTick += uwTickFreq;//为了保证HAL_delay延时参数以ms为单位 默认配置 uwTickFreq=1
}
uint32_t HAL_GetTickPrio(void)
{
return uwTickPrio;
}
__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)
{
}
}
看上去似乎存在一个溢出bug
若tickstart=0xfffffff6; wait=20;
当uwTick溢出变成0 表达式变成(0-0xfffffff6)<21 (1-0xfffffff6)<21 .....何时能退出循环
下面开始测试,cube生成代码 MDK环境 freertos
uint32_t a=UINT_FAST32_MAX-10;
void delay(uint32_t tim)
{
uint32_t tickstart = 0;
tickstart = a;
tim += 1;
while((a - tickstart) < tim)
{
osDelay(50);
}
}
void StartDefaultTask(void const * argument)
{
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init();
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
osDelay(200);
delay(20);
}
/* USER CODE END StartDefaultTask */
}
/* StartTask02 function */
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
a=UINT_FAST32_MAX-10;
for(;;)
{
osDelay(100);
a++;
}
/* USER CODE END StartTask02 */
}
实际进第一次入delay
a=0xfffffff6
退出delay时
a=0x0b;
为了简单没有开定时器。
主要为了验证表达式while((a - tickstart) < tim)
以后可以直接用HAL_Delay不用担心啥问题:lol
然而这是为什么呢?溢出回到0的时候依旧ok
keil无负数
页:
[1]