其实从学习FreeRTOS以来,一直有个疑问:为什么freertos.c中的延时函数要使用osDelay(),而不直接使用HAL_Delay()呢?两者有什么区别?
本节就来探讨一下这个问题的答案:
延时函数分类
相对延时:vTaskDelay
如果跳转osDelay()函数就会发现,底层调用的就是vTaskDelay:
绝对延时:vTaskDelayUntil
可见,相对延时和绝对延时区别就是:相对延时的“ 延时开始起点 ”就是在调用vTaskDelay的那一刻;而绝对延时的“ 延时开始起点 ”是 上一次延时的结束。
在日常使用时,vTaskDelay更为常见!
vTaskDelay 与 HAL_Delay 的区别
- vTaskDelay 作用是让任务阻塞,任务阻塞后,RTOS系统调用其它处于就绪状态的优先级最高的任务来执行。
- HAL_Delay 一直不停的调用获取系统时间的函数,直到指定的时间流逝然后退出,故其占用了全部CPU时间。
因此,在多任务的情况下,vTaskDelay的使用频率会明显更高!