看了操作系统,想自己搞个任务切换,说更改SP的指针,后面一个Ret指令,
就可以跳到栈里保存的函数地址去运行,但是如果写成while(1)这种方式,怎么才能跳出去呢?
说名一下PrintX在别的文件实现了,下面代码编译没错,但是运行的时候,始终在Task1中循环,
怎么才能跳出去?
#if 1
_s8 stack1[10];
_s8 stack2[10];
_s8 stack3[10];
_s8 sptop[3];
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
void Delay()
{
static int i;
for (i = 0; i < 1000; i++);
}
void Task1()
{
while (1)
{
PrintX("Task1\n");
Delay();
LED1 = ~LED1;
SP = sptop[1];
}
}
void Task2()
{
while (1)
{
PrintX("Task2\n");
Delay();
LED2 = ~LED2;
SP = sptop[2];
}
}
void Task3()
{
while (1)
{
PrintX("Task3\n");
Delay();
LED3 = ~LED3;
SP = sptop[0];
}
}
void TaskInit()
{
stack1[1] = (_s16)Task1;
stack1[2] = ((_s16)Task1)>>8;
sptop[0] = stack1;
sptop[0] += 2;
stack2[1] = (_s16)Task2;
stack2[2] = ((_s16)Task2)>>8;
sptop[1] = stack2;
sptop[1] += 2;
stack3[1] = (_s16)Task3;
stack3[2] = ((_s16)Task3)>>8;
sptop[2] = stack3;
sptop[2] += 2;
}
void main()
{
InitUart();
TaskInit();
SP = sptop[0];
}
#endif
------解决方案--------------------
不用一个return,把你赋值SP的放到一个函数里头,调用这个函数你就解决问题了。
感觉你还没有理解SP和PC是怎么控制的。建议还是看看别人写的一些简单的OS,获取你就会有收获了,SP赋值后,如果没有函数返回(你这里的return)就不会有从SP中恢复PC的动作。
------解决方案--------------------
那就给分吧,混了这么久还没有拿到过分呢。。。
------解决方案--------------------
单步调试,能跳到其他任务,上面打错字了。
不好意思,不喜欢查别人的代码。给你一个学习RTOS的例子,自己学,用心看,对你来说绝对很有收获
------解决方案--------------------
单步调试,能跳到其他任务,上面打错字了。
忘了给连接了:http://wenku.baidu.com/view/0091cc254b35eefdc8d33345.html