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任务优先级相关推荐

  1. FreeRTOS 任务优先级说明

    freeRTOS任务优先级与Unix进程优先级不同 FreeRTOS任务优先:任务优先级数值越小,任务优先级越低. Unix任务优先:        进程优先级数值越小,进程优先级越高. 下面对 Fr ...

  2. FreeRTOS任务优先级和系统心跳Tick

    1. FreeRTOS任务优先级介绍 当我们使用xTaskCreate() API函数创建一个任务的时候,会为任务赋予一个初始的优先级,当然这个优先级可以在调度器启动后,我们可以使用vTaskPrio ...

  3. FreeRTOS 任务优先级分配方案

    任务优先级说明 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后的使用中务必要掌握牢固.  FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig. ...

  4. FreeRTOS任务优先级说明

    https://www.cnblogs.com/yangguang-it/p/7156445.html#4217682 下面对 FreeRTOS 优先级相关的几个重要知识点进行下说明,这些知识点在以后 ...

  5. freertos任务优先级分配

    RQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先 级最高的. 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类 ...

  6. cm0中断优先级_转:第13章 FreeRTOS任务优先级修改及其分配方案

    FreeRTOS的配置: FreeRTOSConfig.h文件中的配置如下: /* Ensure stdint is only used by the compiler, and not the as ...

  7. STM32中断优先级、FreeRTOS中断优先级,任务优先级

    STM32中断优先级 NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,管理着整个芯片与中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设.各 ...

  8. cube sdio fatfs 初始化sd卡_Stm32CubeMx配置SDIO+FATFS+FREERTOS

    芯片型号:STM32F427VG 软件版本:Stm32CubeMx 5.6.0 库版本:STM32Cube FW_F4 V1.25.0 配置SDIO: 卡时钟(SDIO_CK ):每个时钟周期在命令和 ...

  9. freeRtos学习笔(2)任务管理

    freeRtos学习笔记 freeRtos任务管理 freeRtos任务状态 freeRtos中任务有四种状态:就绪态.运行态.杜塞态.挂起态. 图 16-1(1): 创建任务→就绪态(Ready): ...

最新文章

  1. php获取网页标题接口,PHP获取网页标题的3种实现方法代码实例
  2. LSTM股票价格预测
  3. ENVI修复图像坏点扩展补丁
  4. 若依框架修改器的使用教程
  5. Vue父组件向子组件传值
  6. eclipse启动mysql报错日志在哪儿_Eclipse启动报错,解决办法
  7. ORACLE进制转换函数
  8. Hello China操作系统STM32移植指南(三)
  9. 递归的Fibonacci在数羊
  10. 一位阿里云小哥要感谢“双11”,于是说了一段脱口秀……
  11. ListView中嵌套checkbox
  12. Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
  13. 干货分享!java进阶视频百度云
  14. FPGA:开发环境Vivado的使用
  15. 人工智能基础部分11-图像识别实战(网络层联想记忆,代码解读)
  16. 【NYOJ】[845]无主之地1
  17. 基于stm32的两轮自平衡小车4(软件调试篇)
  18. 什么是生命?什么是人工智能?
  19. Oracle错误——归档日志已满问题
  20. 骁龙 820 车用处理器

热门文章

  1. Qt工作笔记-对QItemDelegate自定义委托的理解
  2. 6.1树的定义和存储
  3. 简单的反U盘病毒(删除不了的畸形文件夹)
  4. 学计算机的人都会CAD制图吗,CAD到底该如何学习?
  5. python海贼王logo_Python 实现的下载op海贼王网的图片(网络爬虫)
  6. Can 总线 收发原理
  7. ubuntu下NDK环境配置
  8. python读取plt文件吗_用Python读取文件并绘制CDF
  9. (软件工程复习核心重点)第四章总体设计-第三节:启发规则
  10. 二十、子程序设计(函数)