Skip to content

移植接口

关闭中断

c
yr_uint32_t yr_irq_disable(void);

关闭常规中断,并返回关闭前的中断状态。

  • 返回值
    • 返回先前的中断状态,一般用于后续恢复
  • 行为
    • 进入内核临界区前由内核调用
    • 返回值应原样传给恢复中断
  • 说明
    • 这是一个移植层原语,不同架构实现方式可能不同

恢复中断

c
void yr_irq_enable(yr_uint32_t disirq);

恢复先前保存的中断状态。

  • 参数
  • 行为
    • 将处理器中断屏蔽状态恢复到进入临界区之前
  • 说明
    • 必须与 yr_irq_disable() 配对使用

初始化任务栈

c
yr_uint8_t *yr_task_stack_init( void *entry, void *exit,  void *param, yr_uint8_t *stackaddr);

初始化一个任务第一次运行时所需的初始栈帧。

  • 参数
    • entry 任务入口函数地址
    • exit 任务退出后跳转的函数地址
    • param 传递给任务入口函数的参数
    • stackaddr 任务栈顶地址
  • 返回值
    • 返回初始化后的栈指针
  • 行为
    • 构造与目标架构异常返回约定兼容的初始上下文
    • 保证任务被首次切入时可以像“正常运行中的线程”一样恢复执行
  • 说明
    • 这是移植 RTOS 到新架构时最关键的接口之一

首任务切换

c
void yr_task_first_switch_to( yr_uint32_t to);

启动调度器后,切换到第一个任务。

  • 参数
    • to 第一个任务栈指针变量的地址
  • 行为
    • 完成从启动环境到线程调度环境的首次过渡
  • 说明
    • 一般只在调度器启动阶段调用一次

任务切换

c
void yr_task_switch( yr_uint32_t from, yr_uint32_t to);

请求从当前任务切换到目标任务。

  • 参数
    • from 当前任务栈指针变量地址
    • to 目标任务栈指针变量地址
  • 行为
    • 记录旧任务与新任务的栈指针地址
    • 延后通过异常机制完成真正的上下文切换
  • 说明
    • 调度器决定“切给谁”,移植层负责“怎么切过去”

查找最低位 1

c
int yr_find_first_set(int value);

查找一个整数中最低位被置位的 bit 位置。

  • 参数
    • value 输入整数
  • 返回值
    • 返回最低位 1 的位置,若没有置位则返回 0
  • 行为
    • 调度器通过该接口快速找到当前最高优先级的就绪任务
  • 说明
    • 这也是就绪位图调度能保持高效率的关键接口之一

移植接口示例

以下是 Cortex-M3/GCC 端口中与任务切换相关的典型职责划分:

  • yr_irq_disable/yr_irq_enable
    • 基于 PRIMASK 保存和恢复中断状态
  • yr_task_first_switch_to
    • 设置 PendSV 为最低优先级,并通过 SVC 启动首任务
  • yr_task_switch
    • 保存切换请求信息并触发 PendSV
  • PendSV_Handler
    • 保存旧任务 r4-r11,恢复新任务 r4-r11,更新 PSP