-
\"任务优先级\"这一概念在ri5cy_user_manual中有详尽说明
资源介绍
1.5 任务优先级
xTaskCreate() API 函数的参数 uxPriority 为创建的任务赋予了一个初始优先级。这
个侁先级可以在调度器启动后调用 vTaskPrioritySet() API 函数进行修改。
应 用 程 序 在 文 件 FreeRTOSConfig.h 中 设 定 的 编 译 时 配 置 常 量
configMAX_PRIORITIES 的值,即是 多可具有的优先级数目。FreeRTOS 本身并没
有限定这个常量的 大值,但这个值越大,则内核花销的内存空间就越多。所以总是建
议将此常量设为能够用到的 小值。
对于如何为任务指定优先级,FreeRTOS 并没有强加任何限制。任意数量的任务可
以共享同一个优先级——以保证 大设计弹性。当然,如果需要的话,你也可以为每个
任务指定唯一的优先级(就如同某些调度算法的要求一样),但这不是强制要求的。
低优先级号表示任务的优先级低,优先级号 0 表示 低优先级。有效的优先级号范
围从 0 到(configMAX_PRIORITES – 1)。
调度器保证总是在所有可运行的任务中选择具有 高优先级的任务,并使其进入运
行态。如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行。这种
行为方式在之前的例子中可以明显看出来。两个测试任务被创建在同一个优先级上,并
且一直是可运行的。所以每个任务都执行一个”时间片”,任务在时间片起始时刻进入运
行态,在时间片结束时刻又退出运行态。图 3 中 t1 与 t2 之间的时段就等于一个时间片。
要能够选择下一个运行的任务,调度器需要在每个时间片的结束时刻运行自己本
身。一个称为心跳(tick,有些地方被称为时钟滴答,本文中一律称为时钟心跳)中断的
周期性中断用于此目的。时间片的长度通过心跳中断的频率进行设定,心跳中断频率由
FreeRTOSConfig.h 中的编译时配置常量 configTICK_RATE_HZ 进行配置。比如说,
如果 configTICK_RATE_HZ 设为 100(HZ),则时间片长度为 10ms。可以将图 3 进行
扩展,将调度器本身的执行时间在整个执行流程中体现出来。请参见图 4。
需要说明的是,FreeRTOS API 函数调用中指定的时间总是以心跳中断为单位(通
常的提法为心跳”ticks”)。常量 portTICK_RATE_MS 用于将以心跳为单位的时间值转化
为以毫秒为单位的时间值。有效精度依赖于系统心跳频率。
心跳计数(tick count)值表示的是从调度器启动开始,心跳中断的总数,并假定心跳