FreeRTOS实时操作系统的多优先级怎么实现
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍"FreeRTOS实时操作系统的多优先级怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"FreeRTOS实时操作系统的多优先级怎么实现"
千家信息网最后更新 2025年11月15日FreeRTOS实时操作系统的多优先级怎么实现
这篇文章主要介绍"FreeRTOS实时操作系统的多优先级怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"FreeRTOS实时操作系统的多优先级怎么实现"文章能帮助大家解决问题。
如何实现任务多优先级
FreeRTOS中,数字优先级越小,逻辑优先级也越小,空闲任务优先级为0.
List_t pxReadyTasksLists[configMAX_PRIORITIES]是数组,数组下标代表任务优先级,任务创建是根据设置的任务优先级插入到对应下标的列表根节点上,如下。
要支持多优先级,就是再任务切换时让pxCurrentTCB指向最高优先级的TCB即可,之前时手动再任务1、任务2来回切换,现在问题就是怎么找到优先级最高的就绪任务TCB。有2套方法,软件通用方法和硬件指令方法
软件通用方法和硬件指令方法
通过configUSE_PORT_OPTIMISED_TASK_SELECTION指定使用软件通用方法还是硬件指令方法,代码再task.c中
#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )//使用通用方法 /* uxTopReadyPriority 是全局变量,保存着最高优先级 */ #define taskRECORD_READY_PRIORITY( uxPriority ) \ { \ if( ( uxPriority ) > uxTopReadyPriority ) \ { \ uxTopReadyPriority = ( uxPriority ); \ } \ } /* taskRECORD_READY_PRIORITY */ /*-----------------------------------------------------------*/ #define taskSELECT_HIGHEST_PRIORITY_TASK() \ { \ /* 从高到底依次寻找非空的列表根节点下标 */ \ while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \ { \ configASSERT( uxTopReadyPriority ); \ --uxTopReadyPriority; \ } \ \ /* 更新pxCurrentTCB 和*/ \ listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); \ } /* taskSELECT_HIGHEST_PRIORITY_TASK */ /*-----------------------------------------------------------*/ /* 对于软件方式这里做空*/ #define taskRESET_READY_PRIORITY( uxPriority ) #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority )#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ /* 硬件指令方式 */ /* 根据uxPriority来更新uxTopReadyPriority,记录下最高优先级*/ #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) /*-----------------------------------------------------------*/ #define taskSELECT_HIGHEST_PRIORITY_TASK() \ { \ UBaseType_t uxTopPriority; \ \ /* 寻找优先级最高的任务TCB来更新pxCurrentTCB */ \ portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ /*-----------------------------------------------------------*/ /* 清除uxTopReadyPriority的uxPriority 位. */ #define taskRESET_READY_PRIORITY( uxPriority ) \ { \ if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ { \ portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ } \ }#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */下面看着几个port接口
#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) \ ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) \ ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
可以看到硬件方式是把uxTopReadyPriority 看作一个位图,每位代表一个优先级,一共32bit,任务就绪是就把对应位置1,反之清0.

所以获得最高就绪优先级的硬件方法如下(利用clz指令,计算一个变量从高位开始第一次出现1的位前面0的个数,上图clz(uxReadyPriorities)=6)
#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities)\ uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) )
关于"FreeRTOS实时操作系统的多优先级怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
优先级
任务
方法
最高
硬件
指令
软件
更新
操作系统
实时
系统
下标
方式
知识
代表
变量
就是
数组
节点
行业
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全行业建议
新电脑数据库备份
手机谷歌服务器怎么连接
app软件开发要多少钱
网络技术保证书
戴尔服务器更换cpu安装
数据库常用的6种约束是
fm2022数据库灰色
吉林现代软件开发公司
银行业网络安全相关活动
使命召唤如何创建服务器
河南党建设计软件开发
数据库日志一堆n个A
开源网络安全工具软件
女孩学网络技术可以吗
2018网络安全周论坛日程
网络安全竞答题目范围
hk服务器哪个好
网络安全的英语作文80词
19网络技术班的开学第一课
竹溪互联网软件开发口碑推荐
济宁学院春季高考网络技术分数线
哪些数据库账户需要禁用
hp服务器 raid5
上海送货单管理软件开发
手抄报网络安全内容字怎么写
蟠桃汇互联网科技
巴可8s放映机服务器5817
网站源码导入数据库
金融arm服务器采购