READY队列扫描
调度器定期扫描 READY 队列,获取所有就绪任务的优先级信息, 为优先级比较提供数据基础。
HRTOS 调度器基于 READY 队列优先级选择机制,高优先级任务可在时间片边界触发抢占执行。 通过优先级调度,确保高实时性任务优先获得 CPU 执行权。
系统运行两个任务:低优先级任务和高优先级任务,分别控制不同的 LED。 高优先级任务通过更短的延时周期体现抢占式调度的特性,展示 HRTOS 抢占式内核的核心基础。
HRTOS 调度器的核心定义
调度机制是 HRTOS 抢占式内核的核心基础,通过 READY 队列扫描、优先级比较和上下文切换三个关键环节, 实现高优先级任务优先获得 CPU 执行权。
调度器定期扫描 READY 队列,获取所有就绪任务的优先级信息, 为优先级比较提供数据基础。
通过比较 READY 队列中任务的优先级,选择最高优先级任务作为下一个执行对象, 确保高实时性任务优先执行。
调用 os_switch 函数完成任务切换,保存当前任务上下文, 恢复目标任务上下文,实现任务间的无缝切换。
高优先级任务可在时间片边界触发抢占执行,确保高实时性任务能够及时获得 CPU 资源, 满足实时性要求。
任务从创建到调度执行的完整流程
不同优先级任务的执行行为模型
优先级调度的完整实现
task_low 和 task_high 任务函数,分别控制不同的 LED,体现优先级差异
#include "hrtos.h"
sbit LED_HIGH = P1^0;
sbit LED_LOW = P1^1;
void task_low(void)
{
while(1)
{
LED_LOW = ~LED_LOW; // 慢闪
os_delay(20);
}
}
void task_high(void)
{
while(1)
{
LED_HIGH = ~LED_HIGH; // 快闪(体现抢占更频繁)
os_delay(5);
}
}
hrtos_main 函数,创建两个不同优先级的任务并启动调度系统
void hrtos_main(void)
{
LED_LOW = 0;
LED_HIGH = 0;
os_task_create((unsigned int)task_low, 1, 1, 5);
os_task_create((unsigned int)task_high, 2, 3, 5);
}
优先级调度在 HRTOS 中的重要作用
使用本示例时需要关注的关键点
低优先级任务使用优先级1,高优先级任务使用优先级3。 优先级数值越大,优先级越高。合理设置优先级对系统实时性至关重要。
低优先级任务使用 os_delay(20),高优先级任务使用 os_delay(5)。 不同的延时参数体现了优先级差异,高优先级任务执行频率更高。
抢占发生在时间片边界,高优先级任务会在时间片到期时触发抢占。 理解抢占时机有助于优化任务调度策略。
调度器通过扫描READY队列选择最高优先级任务,确保高优先级任务优先执行。 READY队列的管理效率直接影响调度性能。
深入学习的相关资源