任务控制块(TCB)
TCB 是任务在内核中的数据结构,包含任务 ID、优先级、栈指针、状态等信息。 HRTOS 为每个任务维护独立的 TCB,确保任务间的隔离性和可调度性。
在 HRTOS v2 中,任务创建是调度系统的入口点。 任务在创建后立即进入就绪队列,并由调度器参与CPU分配。 本示例演示任务创建流程、任务控制块生成以及任务进入调度系统的完整过程。
系统创建 task_demo 单任务系统,任务周期性翻转 LED,并通过 yield 触发调度切换。 验证 HRTOS v2 的基本调度能力:单任务创建后进入调度系统,并通过 yield 触发上下文切换点。
任务创建是 HRTOS 调度系统的入口点
在 HRTOS v2 中,任务创建通过 os_task_create API 完成。
该函数负责初始化任务控制块(TCB),分配任务栈空间,并将任务加入就绪队列。
任务创建后立即进入 Ready 状态,等待调度器分配 CPU 资源。
TCB 是任务在内核中的数据结构,包含任务 ID、优先级、栈指针、状态等信息。 HRTOS 为每个任务维护独立的 TCB,确保任务间的隔离性和可调度性。
任务创建后立即加入就绪队列,调度器根据优先级和调度算法从就绪队列中选择任务执行。 就绪队列是 HRTOS 调度器的核心数据结构。
task_demo 在无限循环中运行,每次循环执行 LED 翻转, 然后主动调用 yield 触发调度器重新选择任务。 这种模型确保任务不会独占 CPU,支持多任务协作。
本示例的上下文切换来源于 os_task_yield(主动让出CPU)和系统调度点检测。 主动让出 CPU 是协作式调度的典型特征,适用于实时性要求不高的场景。
任务从创建到运行的完整执行路径
任务创建与执行的完整实现
task_demo 任务函数,包含 LED 翻转和 yield 调用
#include "hrtos.h"
#define TASK_ID 1
sbit LED = P1^0;
/* 任务函数 */
void task_demo(void)
{
u16 i;
while(1)
{
LED = ~LED; // 任务运行心跳灯
os_task_yield();
i = 20000;
while(i--);
}
}
hrtos_main 函数,负责创建任务并启动调度系统
/* 系统初始化 */
void hrtos_main(void)
{
/* 创建任务 */
os_task_create((unsigned int)task_demo, TASK_ID, 3, 5);
}
示例执行后的预期行为
使用本示例时需要关注的关键点
创建任务时需要合理配置任务栈大小,栈空间不足会导致系统崩溃。 本示例使用默认栈配置,实际应用中应根据任务需求调整。
任务优先级影响调度器的选择策略。本示例使用优先级 3, 在多任务环境中需要根据实时性要求合理设置优先级。
os_task_yield 应在任务完成关键操作后调用,避免在临界区或中断上下文中调用。 不当的 yield 调用可能导致调度混乱。
本示例为单任务系统,主要用于验证任务创建和基本调度机制。 在多任务环境中,需要考虑任务间同步、通信和资源竞争等问题。
深入学习的相关资源