FreeRTOS内核控制函数

发布时间:2024年01月02日

常见内核控制函数

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

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()

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

文章来源:https://blog.csdn.net/qq_63796876/article/details/135340938
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。