上下文切换(Context Switch)
在 HRTOS v2 中,上下文切换由调度器触发,用于在 task_A 与 task_B 之间保存与恢复执行状态, 实现 LED 任务的交替运行。
本示例行为定义(基于实际代码)
系统运行两个任务:task_A 与 task_B
每个任务独立控制一个 LED,并通过延时循环形成可观察的切换效果。
每个任务独立控制一个 LED,并通过延时循环形成可观察的切换效果。
相关API: os_task_create · os_task_yield · kernel task create
任务执行模型
task_A 与 task_B 均为无限循环任务,通过 LED 翻转 + 软件延时维持运行节奏, 调度器在任务切换点(yield / 时间片)进行上下文切换。
上下文切换触发点
本示例中主要触发来源为:
• 时间片调度(系统Tick)
• task yield 主动让出CPU
执行状态变化
Running → Ready → Running 的循环切换,使 LED_A 与 LED_B 交替变化。
运行流程(基于该示例真实行为)
1. 任务创建
hrtos_main 中创建 task_A 与 task_B,进入 Ready 状态。
2. 调度启动
调度器选择一个任务进入 Running 状态。
3. LED运行阶段
任务控制 LED 翻转,并执行软件延时循环。
4. 时间片/切换点触发
Tick 或 yield 导致 CPU 让出。
5. 上下文保存与恢复
保存当前任务状态,切换到另一个任务继续执行。
相关API: os_task_yield · os_delay · os_task_create
演示代码
#include "hrtos.h"
#define TASK_A 1
#define TASK_B 2
sbit LED_A = P1^0;
sbit LED_B = P1^1;
/* Task A */
void task_A(void)
{
u16 i;
P1=0XFF;
while(1)
{
LED_A = ~LED_A; // Çл»AµÆ×´Ì¬
i=2000;
while(i--);
}
}
/* Task B */
void task_B(void)
{
u16 i;
while(1)
{
LED_B = ~LED_B; // Çл»BµÆ×´Ì¬
i=2000;
while(i--);
}
}
/* 系统入口页 */
void hrtos_main(void)
{
os_task_create((unsigned int)task_A, TASK_A, 3, 2);
os_task_create((unsigned int)task_B, TASK_B, 3, 2);
}
系统本质说明
本示例的核心不是 LED,而是验证 HRTOS v2 中: 两个独立任务在同一CPU上通过调度器实现交替执行。
关键机制:
• task_A / task_B 独立栈
• 调度器基于Ready队列选择任务
• 上下文切换保存寄存器 + 恢复执行点
• task_A / task_B 独立栈
• 调度器基于Ready队列选择任务
• 上下文切换保存寄存器 + 恢复执行点