FreeRTOS内核控制函数

本文详细介绍了嵌入式系统中的关键内核控制函数,如taskYIELD用于调度任务,以及如何使用临界区确保数据一致性。特别关注了中断处理、任务调度器的工作原理,特别是xPendingReadyList的作用。此外,还提到了vTaskSuspendAll和vTaskStepTick在低功耗模式下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见内核控制函数

其中一些函数注意事项和理解:

taskYIELD()

        挑选了就绪列表中优先级最高的函数进行运行

四个和临界区有关的函数

        在临界区中的函数不会被打断!!!比如在创建任务时会后下图这种情况:

                

        似乎上述解释有些不那么深刻,那就换一个例子:假如现在要在一个任务中读取传感器的值,但此时又有一个任务会打断它,那么可能会导致读取传感器的值不准确,那么就可以将读取传感器的任务放在临界区,即,不会被打断,受到了保护。(在一些对时序要求很高的通信也是这样的,比如IIC的初始化等)

        进入临界区的第一件事,就是关闭中断!!

开启中断和关闭中断

        实质上是是否将中断屏蔽掉

关于任务调度器函数

        关于任务调度器的函数实际上没什么好说的,让我个人感觉有些意思的是回复任务调度器的函数有这样一段代码:

                while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
				{
					pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
					( void ) uxListRemove( &( pxTCB->xEventListItem ) );
					( void ) uxListRemove( &( pxTCB->xStateListItem ) );
					prvAddTaskToReadyList( pxTCB );

					/* If the moved task has a priority higher than the current
					task then a yield must be performed. */
					if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority )
					{
						xYieldPending = pdTRUE;
					}
					else
					{
						mtCOVERAGE_TEST_MARKER();
					}
				}

大概的意思就是:在回复任务调度器时,首先会先判断一个列表 xPendingReadyList 是否为空,直到将里面的内容全部放入就绪列表,那么 xPendingReadyList 这个列表是什么呢?在开发手册上是这样写的:

总的来说,xPendingReadyList 列表就相当于一个暂时保存的一个列表

还有一点需要注意的:在使用 xTaskResumeAll() 函数时,前面使用了几次 vTaskSuspendAll() 函数,就要使用几次 xTaskResumeAll() 函数,具体可见在两个函数中同时出现的全局变量 uxSchedulerSuspended。

vTaskStepTick()

        改变系统节拍,可用于低功耗模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值