嵌入式工程师实现一个简单的操作系统(三)

实现2个以上的任务互相切换

​ 目标与计划:

  1. 使用最简单的操作,最低的效率,最笨的方法,实现一个操作系统
  2. 计划支持任务切换、任务调度、内存管理、任务间同步机制、任务间通信机制
  3. 修改实现方式、提升性能与效率

一、任务切换的程序

​ 今天继续学习任务切换的coding,在这之前,我阅读了rtthread的代码中qemu-arm-v9平台以及aarch64平台的部分任务切换相关的程序,并且使用单步调试跟踪了代码,有了一些基本的理解和掌握。现在就根据自己的理解,在现在的软件代码平台进行相关的实现。

接第二节的内容,我思考并记录2个任务切换接口的实现过程:

  • 当前处理器无任务时,切换到第一个任务 task_switch_to(struct task *to)
  • 当前处理器正在执行一个任务,切换到另一个任务task_switch_from_to(struct task *from, struct task *to)

切换过程的伪代码如下:

/* 切换过程中需要保存的信息
struct task
{
    void *sp;               // sp
    unsigned long spsr;     //程序状态寄存器
    unsigned long elr;      //异常返回寄存器
    unsigned long regs[32];
};
*/

void task_switch_to(struct task *to)
{
    //1. 把自己在结构体中的状态恢复到处理器
    //2. 开始执行任务to
}

void task_switch_from_to(struct task *from, struct task *to)
{
    //1. 把当前处理器的状态保存到from任务
    //2. 把任务to的状态恢复到处理器
    //3. 开始执行任务to
}

任务切换的程序具有2个特点

  • 与硬件、处理器架构强相关,紧耦合
  • 需要使用汇编实现

上面有定义出来在aarch64架构下切换任务时,需要保存的状态:

  • sp 堆栈寄存器,因为每一个任务是使用独立的堆栈
  • spsr寄存器 在切换任务时,需要保存当前的处理器计算状态
  • elr寄存器或lr寄存器 记录任务被打断的指令地址,用于后续返回
  • regs 全部的通用寄存器,任务的上下文有使用,不可改变

如何写出一个代码可以实现上面的目标呢,我曾经做过一些尝试,但是存在一些问题:

  1. 我们在编写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值