简易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]到底得到了一个什么东西。小弟很菜,拜托不要说去看什么什么书之类的话,如果并非打击我,推荐几本好书让我补些基础也行。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
skype
1楼-- · 2020-02-05 20:33
LZ的OS多任务没有意义。
代码展开就是
void main()
{
  while(1)
{
   fun1();
   fun2();
   fun3();
}
}
donglaile
2楼-- · 2020-02-06 02:01
 精彩回答 2  元偷偷看……
hacker9
3楼-- · 2020-02-06 07:38
但是这个可以让人明白多任务切换的原理啊、
Pony279
4楼-- · 2020-02-06 12:48
回复【14楼】donglaile
-----------------------------------------------------------------------

这个叫做协作式多任务。

想在51上玩抢占?算了吧,麻烦,低效。
welcome_cool
5楼-- · 2020-02-06 18:09
去看看small rtos for 51.
lovelywwei
6楼-- · 2020-02-06 22:29
中断的精髓。没有中断,神马任务都切换不了。

一周热门 更多>