看了操作系统,想自己搞个任务切换,说更改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 |