最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营【第2期】7天物联网智能家居实战训练营
在学习过程中按照韦老师的方法分析了下freeRTOS源码,如果有不对的地方请指证。
vTaskDelay源码分析,基于cubemx生成的freeRTOS工程。
void vTaskDelay( const TickType_t xTicksToDelay )
{
//xAlreadyYielded:已经调度的状态
//初始赋值为0
BaseType_t xAlreadyYielded = pdFALSE;
/* 延时周期是否大于0,不大于0,就不应该调度 */
if( xTicksToDelay > ( TickType_t ) 0U )
{
configASSERT( uxSchedulerSuspended == 0 );
//1、挂起调度器
vTaskSuspendAll();
{
traceTASK_DELAY();
/* 1、添加任务到延时列表中
2、需要传入两个参数
2.1、xTicksToDelay:延时周期
2.2、pdFALSE:状态值为0
*/
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
}
//恢复调度器,这个调度器是有返回值的,这返回值,表示在恢复调度器
的时候,是否已经进行了任务切换
xAlreadyYielded = xTaskResumeAll();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* xAlreadyYielded 等于FALSE,代表在恢复调度器的时候,没有进行任务切换 */
if( xAlreadyYielded == pdFALSE )
{
//调用了任务切换:内部就是

这篇博客详细分析了FreeRTOS中的vTaskDelay函数,该函数用于任务延时。作者首先介绍了函数的基本逻辑,包括挂起调度器、将当前任务添加到延时列表以及恢复调度器的过程。在添加任务到延时列表时,考虑了任务是否被挂起、延时周期计算以及可能的溢出情况。通过对源码的解析,帮助读者理解FreeRTOS的任务调度机制。
最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



