H HRTOS 示例
Task Execution Core

创建任务

在 HRTOS v2 中,任务创建是调度系统的入口点。 任务在创建后立即进入就绪队列,并由调度器参与CPU分配。 本示例演示任务创建流程、任务控制块生成以及任务进入调度系统的完整过程。

示例目标

系统创建 task_demo 单任务系统,任务周期性翻转 LED,并通过 yield 触发调度切换。 验证 HRTOS v2 的基本调度能力:单任务创建后进入调度系统,并通过 yield 触发上下文切换点。

核心API os_task_create
调度触发 os_task_yield
状态转换 Ready → Running
任务栈 独立任务栈

核心机制

  • 任务控制块(TCB)生成
  • 就绪队列管理
  • CPU 分配与调度
  • 上下文切换触发
Principle

原理说明

任务创建是 HRTOS 调度系统的入口点

在 HRTOS v2 中,任务创建通过 os_task_create API 完成。 该函数负责初始化任务控制块(TCB),分配任务栈空间,并将任务加入就绪队列。 任务创建后立即进入 Ready 状态,等待调度器分配 CPU 资源。

任务控制块(TCB)

TCB 是任务在内核中的数据结构,包含任务 ID、优先级、栈指针、状态等信息。 HRTOS 为每个任务维护独立的 TCB,确保任务间的隔离性和可调度性。

就绪队列管理

任务创建后立即加入就绪队列,调度器根据优先级和调度算法从就绪队列中选择任务执行。 就绪队列是 HRTOS 调度器的核心数据结构。

任务运行模型

task_demo 在无限循环中运行,每次循环执行 LED 翻转, 然后主动调用 yield 触发调度器重新选择任务。 这种模型确保任务不会独占 CPU,支持多任务协作。

调度触发方式

本示例的上下文切换来源于 os_task_yield(主动让出CPU)和系统调度点检测。 主动让出 CPU 是协作式调度的典型特征,适用于实时性要求不高的场景。

核心判断: 任务创建是 HRTOS 调度系统的起点,通过 TCB 生成和就绪队列管理, 实现任务从创建到运行的完整生命周期管理。
Workflow

工作流程

任务从创建到运行的完整执行路径

1系统初始化:hrtos_main 启动任务创建流程
2TCB 生成:创建 task_demo 对应任务控制块
3加入就绪队列:任务进入 Ready 状态等待调度
4CPU 分配:调度器选择 task_demo 进入 Running
5主循环执行:LED 翻转 + 延时 + yield 循环
hrtos_main → os_task_create → TCB 生成 → 就绪队列 → 调度器选择 → CPU 分配 → 任务执行 → yield 触发切换
Core Code

核心代码

任务创建与执行的完整实现

任务函数实现

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);
}
Expected Result

运行结果

示例执行后的预期行为

LED 状态 LED 周期性翻转,作为任务运行的心跳指示
任务调度 task_demo 通过 yield 主动让出 CPU,触发调度器重新选择任务
系统状态 任务在 Ready 和 Running 状态之间切换,验证调度机制
Important Notes

注意事项

使用本示例时需要关注的关键点

任务栈配置

创建任务时需要合理配置任务栈大小,栈空间不足会导致系统崩溃。 本示例使用默认栈配置,实际应用中应根据任务需求调整。

优先级设置

任务优先级影响调度器的选择策略。本示例使用优先级 3, 在多任务环境中需要根据实时性要求合理设置优先级。

yield 调用时机

os_task_yield 应在任务完成关键操作后调用,避免在临界区或中断上下文中调用。 不当的 yield 调用可能导致调度混乱。

单任务系统

本示例为单任务系统,主要用于验证任务创建和基本调度机制。 在多任务环境中,需要考虑任务间同步、通信和资源竞争等问题。