
本帖最后由 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 不用担心啥问题
keil无负数
评分
查看全部评分