打印

关于uCOS-II任务切换请教!

[复制链接]
2876|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjf0000|  楼主 | 2007-4-9 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
任务切换的函数
void OSCtxSw(void)
{
将R1,R2,R3及R4推入当前堆栈;    (1)
OSTCBCur->OSTCBStkPtr = SP;     (2)
OSTCBCur ->OSTCBHighRdy;
SP = OSTCBHighRdy->OSTCBStkPtr;
将R4,R3,R2及R1从新栈中弹出;
执行中断返回指令;
}
第一句中怎么知道原来的堆栈指针在哪啊?
第二句有什么意义,后边不是把这个覆盖了吗?

相关帖子

沙发
ayb_ice| | 2007-4-9 14:11 | 只看该作者

随便说说

将R1,R2,R3及R4推入当前堆栈;(1)=>看清楚是当前堆栈,当然是当前堆栈指针
(2)=>将当前堆栈指针保存在当前堆栈变量中。。。

使用特权

评论回复
板凳
zjf0000|  楼主 | 2007-4-9 14:13 | 只看该作者

那是SP指针指在哪啊?

找了半天也没找到!

使用特权

评论回复
地板
zjf0000|  楼主 | 2007-4-9 14:34 | 只看该作者

怎么没人勒啊?

知道的帮个忙啊?

使用特权

评论回复
5
turmary| | 2007-4-9 16:43 | 只看该作者

基础太差了...

在C51中,变量SP反映的是CPU寄存器的值,
是个特殊的变量,除了取值与赋值是看不见的.

使用特权

评论回复
6
zjf0000|  楼主 | 2007-4-10 08:06 | 只看该作者

回楼上!

你用过uCOS-II吗?请问你不改变sp的值怎么进行任务切换啊?每个任务都是有自己的任务堆栈的!我虽然很菜,但并非一点不懂!

使用特权

评论回复
7
ayb_ice| | 2007-4-10 08:11 | 只看该作者

2楼我已经说的很清楚

2楼我已经说的很清楚,不明白你还要问什么....
你应该会用51吧,对51汇编也应该有了解吧...

使用特权

评论回复
8
zjf0000|  楼主 | 2007-4-10 08:29 | 只看该作者

谢谢ayb_ice的多次帮助!

uCOS-II任务切换前他的sp应该指向自己任务栈栈顶的。但是说当前堆栈,我的弄清楚当前的sp在哪啊?

使用特权

评论回复
9
zjf0000|  楼主 | 2007-4-10 09:10 | 只看该作者

关于uCOS-II,做个总结!

void  main (void)
{

    OSInit();                                              
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();                                             
}
这是主程序,首先初始化,创建任务,开始运行任务。^_^很简单是吧,好戏在后边。
OSStart()调用OSStartHighRdy,这才是真正的运行优先级最高的任务。OSStartHighRdy
            call     #OSTaskSwHook

            mov.b    #1, &OSRunning        
            mov.w    SP, &OSISRStkPtr                  

            mov.w    &OSTCBHighRdy, R13     
            mov.w    @R13, SP            (*)
            POPALL                                   
            reti 
我上边问到的问题答案在这里(*),这是第一次运行任务时保存的sp指针,指向自己的任务栈。后边就开始任务切换了。
OSCtxSw
            push      sr                   
            PUSHALL                         
             
            mov.w     &OSTCBCur, R13       
            mov.w     SP, 0(R13)

            call      #OSTaskSwHook

            mov.b     &OSPrioHighRdy, R13   
            mov.b     R13, &OSPrioCur       
            mov.w     &OSTCBHighRdy, R13   
            mov.w     R13, &OSTCBCur                       
            mov.w     @R13, SP   (**)                   
            POPALL                          
             
            reti  
开始任务切换,首先进行寄存器的保存(包括通用寄存器和特殊寄存器),注意第一次任务切换的时候sp在(*)哪^_^,以后每次任务切换sp都在(**)保存。
就到这里了!!!!!!!!!!!

使用特权

评论回复
10
ayb_ice| | 2007-4-10 09:21 | 只看该作者

随便说说

  每个任务只能在自己的堆栈里运行,但是中断所用的堆栈可能在所有的任务中分配,所以可以看出RTOS很占堆栈,因为每个任务必须为中断分配堆栈,如果有中断嵌套那就更多了,而传统的前后台系统显然要用少得多,小项目用传统方法还是有很大优势的...

使用特权

评论回复
11
zjf0000|  楼主 | 2007-4-10 09:42 | 只看该作者

也是各有好处吧!

虽然说加上RTOS占用了很多的系统资源,但是使各个任务分开,使各个模块之间的耦合度降低,便于程序的修改维护。但是一般的单片机确实不适合上RTOS,系统资源有限。在一般的单片机中确实用前后台比较好!

使用特权

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

本版积分规则

67

主题

421

帖子

1

粉丝