FreeRTOS----任务优先级

        xTaskCreate()API函数的uxPrddddiority参数为正在创建的任务分配初始优先级。 通过使用vTaskPrioritySet()API函数启动调度程序后,可以更改优先级。

        可用的最大优先级数由FreeRTOSConfig.h中的应用程序定义的configMAX_PRIORITIES编译时配置常量设置。 低数字优先级值表示低优先级任务,优先级为0是可能的最低优先级。 因此,可用优先级的范围为0到(configMAX_PRIORITIES - 1)。 任何数量的任务可以共享相同的优先级 - 确保最大的设计灵活性。

        FreeRTOS调度程序可以使用两种方法之一来决定哪个任务处于运行状态。 可以设置configMAX_PRIORITIES的最大值取决于使用的方法:

1. 通用方法

        通用方法在C中实现,可以与所有FreeRTOS架构端口一起使用。

        当使用通用方法时,FreeRTOS不会限制可以设置configMAX_PRIORITIES的最大值。 然而,始终建议将configMAX_PRIORITIES值保持在必要的最小值,因为它的值越高,将消耗的RAM越多,并且最坏的执行时间将越长。

        如果在FreeRTOSConfig.h中将configUSE_PORT_OPTIMISED_TASK_SELECTION设置为0,或者如果configUSE_PORT_OPTIMISED_TASK_SELECTION未定义,或者通用方法是为使用的FreeRTOS端口提供的唯一方法,则将使用通用方法。

2.架构优化方法

        架构优化方法使用少量的汇编代码,并且比通用方法更快。 configMAX_PRIORITIES设置不会影响最坏的执行时间。

        如果使用架构优化方法,那么configMAX_PRIORITIES不能大于32.  与通用方法一样,建议将configMAX_PRIORITIES保持在必要的最小值,因为它的值越高,RAM将被消耗越多。

        如果在FreeRTOSConfig.h中configUSE_PORT_OPTIMISED_TASK_SELECTION设置为1,将使用体系结构优化方法。

        不是所有的FreeRTOS端口都提供一种架构优化的方法。

        


        FreeRTOS调度程序将始终确保能够运行的最高优先级任务是选择进入运行状态的任务。 如果具有相同优先级的多个任务能够运行,则调度程序将依次转换每个任务进出运行状态。



### FreeRTOS 任务调度原理解析 #### 任务调度的核心结构 FreeRTOS 使用链表来管理系统中的各个任务,这些链表用于维护不同状态下的任务列表。每当发生TICK中断时,即每隔固定的周期产生一次定时器中断,系统会检查当前的任务状态并决定下一个要执行的任务[^1]。 #### 启动任务调度过程 当应用程序调用了`vTaskStartScheduler()`函数之后,FreeRTOS将会初始化必要的内核对象,并创建一个特殊的空闲任务(idle task)。此空闲任务会在没有任何更高优先级可运行任务的情况下被执行;它通常负责处理诸如降低CPU功耗之类的低级别操作[^2]。 #### 上下文切换触发条件 每次进入Systick中断期间——这是由硬件定时器驱动的一个定期发生的事件——操作系统都会评估是否存在新加入到就绪队列里的高优先级任务等待执行。如果确实存在这样的情况,则会设置标志位以请求稍后挂起PendSV异常来进行实际的上下文切换工作[^3]。 #### 初始任务的选择逻辑 在首次激活调度程序之前已经创建好的所有任务当中,具有最高优先级别的那个会被选作首个投入运行的对象。而在同属这一最高等级的一组候选者之间,则按照它们被建立的时间顺序逆序选取最后生成的那个作为起点[^4]。 ```c // 示例代码展示如何启动调度器 void main(void){ // 创建一些任务... // 开始多任务调度 vTaskStartScheduler(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值