移植接口
关闭中断
c
yr_uint32_t yr_irq_disable(void);关闭常规中断,并返回关闭前的中断状态。
- 返回值
- 返回先前的中断状态,一般用于后续恢复
- 行为
- 进入内核临界区前由内核调用
- 返回值应原样传给恢复中断
- 说明
- 这是一个移植层原语,不同架构实现方式可能不同
恢复中断
c
void yr_irq_enable(yr_uint32_t disirq);恢复先前保存的中断状态。
- 参数
- 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
- 保存旧任务