当前位置: 代码迷 >> 单片机 >> 大家说,为什么小弟我这个代码始终在while(1)中循环
  详细解决方案

大家说,为什么小弟我这个代码始终在while(1)中循环

热度:103   发布时间:2016-04-28 15:11:35.0
大家说,为什么我这个代码始终在while(1)中循环?
看了操作系统,想自己搞个任务切换,说更改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的动作。
------解决方案--------------------
引用:
Quote: 引用:

不用一个return,把你赋值SP的放到一个函数里头,调用这个函数你就解决问题了。
感觉你还没有理解SP和PC是怎么控制的。建议还是看看别人写的一些简单的OS,获取你就会有收获了,SP赋值后,如果没有函数返回(你这里的return)就不会有从SP中恢复PC的动作。

点醒我了兄弟

那就给分吧,混了这么久还没有拿到过分呢。。。
------解决方案--------------------
引用:
单步调试,能跳到其他任务,上面打错字了。


不好意思,不喜欢查别人的代码。给你一个学习RTOS的例子,自己学,用心看,对你来说绝对很有收获
------解决方案--------------------
引用:
单步调试,能跳到其他任务,上面打错字了。

忘了给连接了:http://wenku.baidu.com/view/0091cc254b35eefdc8d33345.html
  相关解决方案