打印
[ZLG-ARM]

请教周工:关于ucos2任务切换问题

[复制链接]
1889|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengziaq|  楼主 | 2007-10-9 12:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos2, ST, tc, RS, ps
最近研究了一下光盘中关于ucos2一种的问题 
其中关于任务切换函数不是很明白 光盘源代码如下:

OSIntCtxSw
                                                    ;下面为保存任务环境
1        LDR     R2, [SP, #20]                       ;获取PC
2        LDR     R12, [SP, #16]                      ;获取R12
3        MRS     R0, CPSR

4        MSR     CPSR_c, #(NoInt | SYS32Mode)
5        MOV     R1, LR
6        STMFD   SP!, {R1-R2}                        ;保存LR,PC
7        STMFD   SP!, {R4-R12}                       ;保存R4-R12

8        MSR     CPSR_c, R0
9        LDMFD   SP!, {R4-R7}                        ;获取R0-R3
10        ADD     SP, SP, #8                          ;出栈R12,PC
        
11        MSR     CPSR_c, #(NoInt | SYS32Mode)
12        STMFD   SP!, {R4-R7}                        ;保存R0-R3
        
13        LDR     R1, =OsEnterSum                     ;获取OsEnterSum
14        LDR     R2, [R1]
15        STMFD   SP!, {R2, R3}                       ;保存CPSR,OsEnterSum

                                                    ;保存当前任务堆栈指针到当前任务的TCB
16        LDR     R1, =OSTCBCur
17        LDR     R1, [R1]
18        STR     SP, [R1]

19        BL      OSTaskSwHook                        ;调用钩子函数
                                                    ;OSPrioCur <= OSPrioHighRdy
20        LDR     R4, =OSPrioCur
21        LDR     R5, =OSPrioHighRdy
22        LDRB    R6, [R5]
23        STRB    R6, [R4]
                                                    ;OSTCBCur <= OSTCBHighRdy
24        LDR     R6, =OSTCBHighRdy
25        LDR     R6, [R6]
26        LDR     R4, =OSTCBCur
27        STR     R6, [R4]
OSIntCtxSw_1
                                                    ;获取新任务堆栈指针
28       LDR     R4, [R6]
29        ADD     SP, R4, #68                         ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
30        LDR     LR, [SP, #-8]
31        MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
32        MOV     SP, R4                              ;设置堆栈指针

33        LDMFD   SP!, {R4, R5}                       ;CPSR,OsEnterSum
                                                    ;恢复新任务的OsEnterSum
34       LDR     R3, =OsEnterSum
35        STR     R4, [R3]
    
36        MSR     SPSR_cxsf, R5                       ;恢复CPSR
37        LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务

我的理解是:
1-15是将当前模式(也就是管理模式或者是IRQ中断模式)下的R0-R3,R12和LR(也就是用户/系统模式下的PC)转移到系统模式的堆栈当中,同时将R4-R11和LR(用户/系统模式下LR)保存到系统模式的堆栈当中。
18是将系统模式的堆栈指针赋给OSTCBCur->OSTCBStkPtr

这是为什么啊?
在任务切换的时候应该将当前任务运行的上下文保存到当前任务的堆栈中才可以啊

我查看了一下你们公司的ARM问题.pdf资料文档。看到了对126问的回答:其中说:任务是运行在用户/系统模式下的,这两个模式使用同一个SP,这时系统模式的SP指向的就是任务的堆栈

为什么系统模式的SP指向的就是任务的堆栈?

系统运行时每个任务都分配了自己的堆栈,用户/系统模式也有自己的堆栈
他们应该是不同地址空间的啊

不是很明白啊

请指教 谢谢!

相关帖子

沙发
lammy| | 2007-10-10 07:42 | 只看该作者

呵呵,提醒一下

要记住r0~r12只要不是在快速中断下,所有的模式都是共用的,记住这个后,再看看我以前的文档笔记,附上网址:https://bbs.21ic.com/club/bbs/bbsView.asp?action=topicwithme  相信你会明白的。

使用特权

评论回复
板凳
fengziaq|  楼主 | 2007-10-10 09:19 | 只看该作者

刚才的问题解决了

谢谢了
虽然你给我的网址打开不对

不过我还有一个小问题
个人认为
30        LDR     LR, [SP, #-8]

37        LDMFD   SP!, {R0-R12, LR, PC }^      
是不是对LR的操作重复了啊
18 是不可以删掉?

使用特权

评论回复
地板
fengziaq|  楼主 | 2007-10-10 09:44 | 只看该作者

晕 是我看错了

两个LR不一样
一个是系统模式的 一个是管理模式的

使用特权

评论回复
5
lammy| | 2007-10-10 18:02 | 只看该作者

我也是这样理解的

https://bbs.21ic.com/club/bbs/list.asp?boardid=39&page=1&t=2627752&tp=ARM_ucos_Study-%u79FB%u690D%u4EE3%u7801%u5206%u6790%5Blpc22xx%5D%5B%u539F%5D--%u5DF2%u53EF%u4EE5%u4E0B%u8F7D

这个可以啦

使用特权

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

本版积分规则

6

主题

10

帖子

0

粉丝