实现2个以上的任务互相切换
目标与计划:
- 使用最简单的操作,最低的效率,最笨的方法,实现一个操作系统
- 计划支持任务切换、任务调度、内存管理、任务间同步机制、任务间通信机制
- 修改实现方式、提升性能与效率
一、任务切换的程序
今天继续学习任务切换的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 全部的通用寄存器,任务的上下文有使用,不可改变
如何写出一个代码可以实现上面的目标呢,我曾经做过一些尝试,但是存在一些问题:
-
我们在编写