FreeRTOS任务优先级
FreeRTOS任务优先级数值越小优先级越低,系统在运行过程中允许修改任务优先级
修改任务优先级的主要工作包括:
如果新的优先级大于当前任务优先级,则请求切换
重新设置事件列表值
将任务从原就绪列表中移除并挂接到新的就绪列表中
/* 设置任务优先级 */
void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority)
{TCB_t *pxTCB;UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry;BaseType_t xYieldRequired = pdFALSE;configASSERT((uxNewPriority < configMAX_PRIORITIES));/* 任务优先级不能超过最大值 */if(uxNewPriority >= (UBaseType_t)configMAX_PRIORITIES){uxNewPriority = (UBaseType_t)configMAX_PRIORITIES - (UBaseType_t)1U;}else{mtCOVERAGE_TEST_MARKER();}taskENTER_CRITICAL();{/* 通过任务句柄获取任务TCB */pxTCB = prvGetTCBFromHandle(xTask);traceTASK_PRIORITY_SET(pxTCB, uxNewPriority);#if (configUSE_MUTEXES == 1){uxCurrentBasePriority = pxTCB->uxBasePriority;}#else{/* 记录原先的优先级 */uxCurrentBasePriority = pxTCB->uxPriority;}#endif/* 优先级和原先优先级不同 */if(uxCurrentBasePriority != uxNewPriority){/* 新优先级大于原优先级 */if(uxNewPriority > uxCurrentBasePriority){/* 该任务不是当前任务 */if(pxTCB != pxCurrentTCB){/* 新优先级大于当前任务优先级 */if(uxNewPriority >= pxCurrentTCB->uxPriority){/* 请求切换任务 */xYieldRequired = pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}else{}}/* 该任务为当前任务 */else if(pxTCB == pxCurrentTCB){/* 请求切换任务 */xYieldRequired = pdTRUE;}else{}/* 记录原优先级 */uxPriorityUsedOnEntry = pxTCB->uxPriority;#if (configUSE_MUTEXES == 1){if(pxTCB->uxBasePriority == pxTCB->uxPriority){pxTCB->uxPriority = uxNewPriority;}else{mtCOVERAGE_TEST_MARKER();}pxTCB->uxBasePriority = uxNewPriority;}#else{/* 设置新优先级 */pxTCB->uxPriority = uxNewPriority;}#endif/* 重新设置事件列表项的值 */if((listGET_LIST_ITEM_VALUE(&(pxTCB->xEventListItem)) & taskEVENT_LIST_ITEM_VALUE_IN_USE) == 0UL){listSET_LIST_ITEM_VALUE(&(pxTCB->xEventListItem), ((TickType_t)configMAX_PRIORITIES - (TickType_t)uxNewPriority));}else{mtCOVERAGE_TEST_MARKER();}/* 任务在就绪列表中 */if(listIS_CONTAINED_WITHIN(&(pxReadyTasksLists[uxPriorityUsedOnEntry]), &(pxTCB->xStateListItem)) != pdFALSE){/* 从原就绪列表中移除,就绪列表已经没有任务 */if(uxListRemove(&(pxTCB->xStateListItem)) == (UBaseType_t)0){/* 清除任务优先级记录中的优先级 */portRESET_READY_PRIORITY(uxPriorityUsedOnEntry, uxTopReadyPriority);}else{mtCOVERAGE_TEST_MARKER();}/* 将任务加入新的就绪列表 */prvAddTaskToReadyList(pxTCB);}else{mtCOVERAGE_TEST_MARKER();}/* 需要请求切换任务 */if(xYieldRequired != pdFALSE){taskYIELD_IF_USING_PREEMPTION();}else{mtCOVERAGE_TEST_MARKER();}(void)uxPriorityUsedOnEntry;}}taskEXIT_CRITICAL();
}
系统也提供了获取任务优先级的接口,程序比较简单
/* 获取任务优先级 */
UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask)
{TCB_t const *pxTCB;UBaseType_t uxReturn;taskENTER_CRITICAL();{pxTCB = prvGetTCBFromHandle(xTask);uxReturn = pxTCB->uxPriority;}taskEXIT_CRITICAL();return uxReturn;
}
/* 在中断中获取任务优先级 */
UBaseType_t uxTaskPriorityGetFromISR(const TaskHandle_t xTask)
{TCB_t const *pxTCB;UBaseType_t uxReturn, uxSavedInterruptState;portASSERT_IF_INTERRUPT_PRIORITY_INVALID();uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR();{pxTCB = prvGetTCBFromHandle(xTask);uxReturn = pxTCB->uxPriority;}portCLEAR_INTERRUPT_MASK_FROM_ISR(uxSavedInterruptState);return uxReturn;
}
FreeRTOS任务优先级相关推荐
- FreeRTOS 任务优先级说明
freeRTOS任务优先级与Unix进程优先级不同 FreeRTOS任务优先:任务优先级数值越小,任务优先级越低. Unix任务优先: 进程优先级数值越小,进程优先级越高. 下面对 Fr ...
- FreeRTOS任务优先级和系统心跳Tick
1. FreeRTOS任务优先级介绍 当我们使用xTaskCreate() API函数创建一个任务的时候,会为任务赋予一个初始的优先级,当然这个优先级可以在调度器启动后,我们可以使用vTaskPrio ...
- FreeRTOS 任务优先级分配方案
任务优先级说明 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固. FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig. ...
- FreeRTOS任务优先级说明
https://www.cnblogs.com/yangguang-it/p/7156445.html#4217682 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后 ...
- freertos任务优先级分配
RQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先 级最高的. 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类 ...
- cm0中断优先级_转:第13章 FreeRTOS任务优先级修改及其分配方案
FreeRTOS的配置: FreeRTOSConfig.h文件中的配置如下: /* Ensure stdint is only used by the compiler, and not the as ...
- STM32中断优先级、FreeRTOS中断优先级,任务优先级
STM32中断优先级 NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,管理着整个芯片与中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设.各 ...
- cube sdio fatfs 初始化sd卡_Stm32CubeMx配置SDIO+FATFS+FREERTOS
芯片型号:STM32F427VG 软件版本:Stm32CubeMx 5.6.0 库版本:STM32Cube FW_F4 V1.25.0 配置SDIO: 卡时钟(SDIO_CK ):每个时钟周期在命令和 ...
- freeRtos学习笔(2)任务管理
freeRtos学习笔记 freeRtos任务管理 freeRtos任务状态 freeRtos中任务有四种状态:就绪态.运行态.杜塞态.挂起态. 图 16-1(1): 创建任务→就绪态(Ready): ...
最新文章
- php获取网页标题接口,PHP获取网页标题的3种实现方法代码实例
- LSTM股票价格预测
- ENVI修复图像坏点扩展补丁
- 若依框架修改器的使用教程
- Vue父组件向子组件传值
- eclipse启动mysql报错日志在哪儿_Eclipse启动报错,解决办法
- ORACLE进制转换函数
- Hello China操作系统STM32移植指南(三)
- 递归的Fibonacci在数羊
- 一位阿里云小哥要感谢“双11”,于是说了一段脱口秀……
- ListView中嵌套checkbox
- Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
- 干货分享!java进阶视频百度云
- FPGA:开发环境Vivado的使用
- 人工智能基础部分11-图像识别实战(网络层联想记忆,代码解读)
- 【NYOJ】[845]无主之地1
- 基于stm32的两轮自平衡小车4(软件调试篇)
- 什么是生命?什么是人工智能?
- Oracle错误——归档日志已满问题
- 骁龙 820 车用处理器