保持任务执行连续性
任务被暂停后,其必要的寄存器、堆栈和执行位置等状态必须得到妥善保留, 才能在后续恢复时继续正确执行。
上下文切换是多任务操作系统复用处理器的关键机制。 它负责保存当前执行流的必要状态,并使另一个执行流能够从正确的位置继续运行。 理解这一过程,是认识任务调度、中断处理和实时响应的重要基础。
上下文切换解决的是执行现场如何迁移,而调度解决的是接下来应该运行谁。 两者紧密相关,但不是同一个概念。 上下文切换的具体步骤取决于处理器架构、编译器约定和内核实现。
上下文(Context)是一个执行流在特定时刻继续运行所需的处理器状态及相关执行信息。 上下文切换(Context Switch)则是从一个执行流转移到另一个执行流时, 保存前者所需状态、建立后者执行现场的过程。
在多任务 RTOS 中,多个任务共享同一个处理器。 当调度器决定更换当前任务时,内核必须保证被切出的任务以后仍能正确恢复, 同时目标任务也能在正确的执行位置继续运行。
需要注意: 并非每次函数调用、每次中断或每次调度判断都会发生任务上下文切换。 如果调度结果仍是当前任务,就可能不需要切换到另一个任务。
任务被暂停后,其必要的寄存器、堆栈和执行位置等状态必须得到妥善保留, 才能在后续恢复时继续正确执行。
单核处理器在某一时刻执行有限的指令流。 操作系统通过任务切换,让多个任务在时间上交替获得处理器。
当前任务阻塞或更高优先级任务就绪时, 调度器可以根据系统策略决定是否更换当前执行任务。
每个任务需要满足其执行模型所要求的状态保存规则。 如果必要状态遭到破坏,恢复后的行为就可能错误。
上下文的具体组成没有适用于所有处理器的统一清单。 以下列出常见类别;某项状态可能由硬件自动保存、由软件保存, 或由其他机制保证不需要在每次切换时保存。
| 状态类别 | 作用 | 实现注意事项 |
|---|---|---|
| 程序计数器(PC) | 确定执行流恢复时的位置。 | 可能由调用、返回、中断入口等硬件或指令机制参与保存。 |
| 栈指针(SP) | 定位当前执行流使用的栈。 | 切换时需要遵循处理器的栈结构与编译器调用约定。 |
| 通用寄存器 | 保存计算结果、临时变量及参数等状态。 | 具体保存集合取决于 ABI、寄存器使用规则和切换实现。 |
| 处理器状态 | 包括特定架构中的标志位、控制状态等。 | 是否需要保存取决于这些状态是否可能跨切换发生变化。 |
| 任务控制信息 | 记录任务栈位置、状态及调度所需的数据。 | 通常由内核维护,不等同于 CPU 寄存器上下文。 |
PC 与 SP 的含义需要区分。 PC 表示处理器执行位置;SP 表示当前栈的位置。 任务控制块(TCB)则是内核管理任务的数据结构。 三者承担不同职责,不能将 TCB 简单理解为整个 CPU 上下文。
以下是一个抽象模型,用来解释从当前任务切换到目标任务时需要解决的问题。 实际实现可能将多个步骤合并到汇编代码、中断入口或调度器中。
例如当前任务阻塞、调度时机到来,或系统需要响应更高优先级任务。
按照架构与调用约定,保存继续运行所需的寄存器、返回位置及其他必要状态。
将任务恢复所需的信息放置在约定位置,例如保存当前任务的栈指针。
调度器根据就绪状态、优先级及相应调度策略选择接下来应运行的任务。
恢复目标任务的栈位置和所需处理器状态;首次运行的任务可能使用预先构造的初始现场。
通过相应的返回、跳转或恢复机制,使处理器继续执行目标任务。
注:这是概念流程,并不表示所有 RTOS 都严格按照六个独立步骤执行, 也不表示调度器必须在寄存器全部保存后才开始任何调度相关操作。
定时器中断可能使调度器获得运行机会。 是否切换取决于时间片策略、任务优先级及当前系统状态。
在允许抢占的调度模型中,如果更高优先级任务变为就绪状态, 内核可能在适当时机切换到该任务。
当前任务等待事件、延时或主动让出处理器时, 内核可能选择另一个可运行任务。
中断可能改变任务就绪状态。 如果内核允许在中断退出路径进行调度,任务切换可能发生在相应的退出阶段。
区分三个事件: 中断发生、调度器作出决定、任务上下文实际切换。 它们可能连续发生,但并不是同一件事。 在某些系统中,中断结束后仍然继续运行原任务。
上下文切换需要执行额外的保存、恢复和管理操作。 这些操作占用处理器时间,也可能影响任务响应时间。 但切换成本并不只由寄存器数量决定,还取决于具体实现和切换路径。
寄存器保存与恢复、栈访问、任务控制信息更新, 以及调度器执行所需的指令。
中断入口与退出、临界区处理、优先级判断等操作, 可能成为完整切换路径的一部分。
切换过于频繁可能增加管理成本, 但减少切换也不能以牺牲必要的任务响应为代价。
评估实时性时,应分析相关执行路径的最坏情况耗时, 并结合中断延迟、调度等待和其他阻塞因素。
因此,上下文切换足够快并不自动意味着系统满足硬实时约束。 对实时系统而言,还需要根据任务截止时间与具体执行路径进行分析。
8051 与许多现代 32 位微控制器具有不同的处理器结构。 在 8051 上设计任务切换机制时,寄存器组、内部 RAM、堆栈以及中断入口行为, 都可能直接影响上下文保存与恢复方案。
8051 的寄存器组与 PSW 中的寄存器组选择位相关。 切换实现必须正确处理寄存器组的使用和恢复约定。
内部 RAM 空间有限,栈增长与任务现场保存需要考虑内存布局和可用空间。
中断入口、返回地址、寄存器保存规则与嵌套行为, 都会影响从中断进入调度及恢复任务的过程。
架构原则: 上下文切换必须与实际处理器、编译器及内核的执行约定保持一致。 不能直接将 Cortex-M 的自动压栈模型或其他架构的寄存器保存规则套用到 8051。
对 HRTOS 而言,进一步分析时应以实际的任务切换汇编、栈布局、 中断入口与退出代码,以及 Keil C51 的编译结果为依据。 只有确认了具体实现,才能准确说明哪些状态由硬件处理、哪些由内核保存, 并计算切换路径的实际指令开销。
上下文切换的核心任务,是确保执行流在暂停之后仍能正确恢复。 调度器决定后续执行任务,而上下文切换机制负责实现相应的执行现场迁移。
正确性决定任务能否恢复, 执行开销影响处理器效率, 最坏情况边界则是实时性分析的重要组成部分。
上下文切换需要结合调度决策和中断执行路径理解。 建议继续阅读以下相关内容。