常见内核控制函数
其中一些函数注意事项和理解:
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()
改变系统节拍,可用于低功耗模式