|
看了论坛里那个简易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],但实际上仿真时的结果是这样的
![](http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_694996QKXH5N.jpg)
(原文件名:未命名.jpg)
里面的0x14是什么??地址?
![](http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_694997XX5W67.jpg)
(原文件名:QQ截图未命名.jpg)
这里并没有储存task_stack[1]的任何东西呀。我就想知道,task_sp[1]到底得到了一个什么东西。小弟很菜,拜托不要说去看什么什么书之类的话,如果并非打击我,推荐几本好书让我补些基础也行。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|