打印

代码问题

[复制链接]
838|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2013-9-21 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了操作系统,想自己搞个任务切换,说更改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

相关帖子

沙发
火箭球迷| | 2013-9-21 18:48 | 只看该作者
你这样能实现任务切换么?
我觉得更可能飞掉....

使用特权

评论回复
板凳
xsgy123| | 2013-9-21 19:04 | 只看该作者
当然会跑飞,不注意各自任务栈的保存和恢复,各自任务栈的切换,之前不久还见有人问过类似的问题,说是怎么就跑飞了,他那时只是做了PC的任务切换,不关心SP,当然要跑飞。

LZ这只是想用最简单的方式试一下切换,那就先不管跑飞不跑飞,先试试切换能不能切换,后面再接着做现场保存和切换,任务栈切换嘛。一步一步来嘛,我之前写任务调度器也是一步一步这样来完善的,要一次全部做好,确实不容易。

使用特权

评论回复
地板
无冕之王| | 2013-9-21 19:07 | 只看该作者
修改SP之后必须有一个返回操作才能出现从堆栈里面读取PC的动作。
你的代码里面只实现了SP的赋值,没有实现堆栈的获取。
另外你旧的PC没有保存,所以就算实现了,所有的的任务就只能run一次。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝