简易OS多任务是怎样切换的?

2020-02-04 09:28发布

看了论坛里那个简易OS,对任务切换有些不理解,自己写了一个类似的,但不保存SP,这样三个任务会不停循环执行,任务函数也不用死循环了。
首先,如果哪位能解释这个任务切换是怎样实现的,请直接给我解释一下,谢谢了。

这是我写的代码
#include<reg52.h>
unsigned int task_sp[3];
unsigned char task_stack[3][12];
unsigned char task_id=0,i=0;
void task_switch()
{
// task_sp[task_id]=SP;
  if(task_id==2)task_id=0;
  else task_id++;
  SP=task_sp[task_id];         
}
void task1()
{
  i++;
  task_switch();
}
void task2()
{
  i++;
  task_switch();
}
void task3()
{
  i++;
  task_switch();
}
void task_init()
{
  task_stack[0][0]=(unsigned int)task1 & 0xff;
  task_stack[0][1]=(unsigned int)task1 >> 8;
  task_sp[0]=task_stack[0]+1;
  task_stack[1][0]=(unsigned int)task2 & 0xff;
  task_stack[1][1]=(unsigned int)task2 >> 8;
  task_sp[1]=task_stack[1]+1;
  task_stack[2][0]=(unsigned int)task3 & 0xff;
  task_stack[2][1]=(unsigned int)task3 >> 8;
  task_sp[2]=task_stack[2]+1;          
}
void os_start(tid) {task_id = tid,SP = task_sp[tid];return;}
void main()
{
  task_init();
  os_start(0);
}
对于  task_sp[1]=task_stack[1]+1;这一句,根据书上说的,就是把task_stack[1][1]里的值赋给task_sp[1],但实际上仿真时的结果是这样的

(原文件名:未命名.jpg)

里面的0x14是什么??地址?

(原文件名:QQ截图未命名.jpg)

这里并没有储存task_stack[1]的任何东西呀。我就想知道,task_sp[1]到底得到了一个什么东西。小弟很菜,拜托不要说去看什么什么书之类的话,如果并非打击我,推荐几本好书让我补些基础也行。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。