FreeRTOS内核控制函数
2024-01-02 18:03:18
常见内核控制函数
其中一些函数注意事项和理解:
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!