OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7677|回复: 13

ucosii移植时,PendSVHandler中堆栈指针(psp)的问题

[复制链接]

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2013-12-21 22:55:23 | 显示全部楼层 |阅读模式

PendSV_Handler_Nosave
    PUSH    {R14}                                               ; Save LR exc_return value
    LDR     R0, =OSTaskSwHook                                   ; OSTaskSwHook();
    BLX     R0
    POP     {R14}

    LDR     R0, =OSPrioCur                                      ; OSPrioCur = OSPrioHighRdy;
    LDR     R1, =OSPrioHighRdy
    LDRB    R2, [R1]
    STRB    R2, [R0]           ;把当前优先级换为最高优先级

    LDR     R0, =OSTCBCur                                       ; OSTCBCur  = OSTCBHighRdy;
    LDR     R1, =OSTCBHighRdy
    LDR     R2, [R1]
    STR     R2, [R0]           ;把任务块换位最高优先级的任务块

    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
    LDM     R0, {R4-R11}                                        ; Restore r4-11 from new process stack经过这部之后psp应该指向下图红色R0处吗?
    ADDS    R0, R0, #0x20        ;这部调整后那psp岂不是指向下图绿色位置?要是那样的话内核自动出栈的话是不是先出xPSR?  
    MSR     PSP, R0                                             ; Load PSP with new process SP
                ;将新的任务块的堆栈指针加载到PSP里
    ORR     LR, LR, #0x04                                       ; Ensure exception return uses process stack(从进程堆栈中做出栈操作,返回后使用PSP)
    CPSIE   I
    BX      LR                                                  ; Exception return will restore remaining context

//                 |     ....        |
;//                 |-----------------|
;//                 |     ....        |
;//                 |-----------------|
;//                 |     ....        |
;//                 |-----------------|       |---- 任务切换时PSP
;//     Low Memory  |     ....        |       |
;//                 |-----------------|       |    |---------------|      |----------------|
;//        ^        |       R4        |  <----|----|--OSTCBStkPtr  |<-----|   (OS_TCB *)   |
;//        ^        |-----------------|            |---------------|      |----------------|
;//        ^        |       R5        |            |               |         OSTCBHighRdy
;//        |        |-----------------|            |---------------|
;//        |        |       R6        |            |               |
;//        |        |-----------------|            |---------------|
;//        |        |       R7        |            |               |
;//        |        |-----------------|            |---------------|
;//        |        |       R8        |                 Task's
;//        |        |-----------------|                 OS_TCB
;//        |        |       R9        |
;//        |        |-----------------|
;//        |        |      R10        |
;//      Stack      |-----------------|
;//      Growth     |      R11        |
;//       = 1       |-----------------|
;//        |        |    R0 = p_arg   |  <-------- 异常时的PSP (向上生长的满栈)    指向这里
;//        |        |-----------------|
;//        |        |       R1        |
;//        |        |-----------------|
;//        |        |       R2        |
;//        |        |-----------------|
;//        |        |       R3        |
;//        |        |-----------------|
;//        |        |       R12       |
;//        |        |-----------------|
;//        |        |       LR        |
;//        |        |-----------------|
;//        |        |    PC = task    |
;//        |        |-----------------|
;//        |        |      xPSR       |<---------------调整指针后指向这里
;//    High Memory  |-----------------|
大虾帮忙解答一下吧,小白困扰好久了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-21 23:54:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-12-22 11:45:31 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥能帮忙解答一下吗?
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-22 14:48:04 | 显示全部楼层
为什么困扰呢?
态度决定一切
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-22 19:46:17 | 显示全部楼层
执行:LDM     R0, {R4-R11}时,出栈R4-R11
执行:ADDS    R0, R0, #0x20;R0往上曾8个字空间,也就是8个寄存器被出栈了。
执行:MSR     SP, R0 ; SP现在指向了模拟中断那8个入栈的内容,
也就是指向p_arg。
在中断退出时PSP做出完美出栈。任务切换完成。
xPSR最后一个出栈。
态度决定一切
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-12-22 20:29:30 | 显示全部楼层
回复【5楼】冰封嗜魔:
---------------------------------
执行:LDM     R0, {R4-R11}时,出栈R4-R11 
我觉得这时的PSP是指向p_arg的,
执行:ADDS    R0, R0, #0x20;R0往上曾8个字空间
然后调整后这时的PSP指向xPSR。
顺便问一下:LDM指令后没写模式,那是递减还是递增?
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-22 21:24:13 | 显示全部楼层
LDM     R0, {R4-R11} 从r0表示的地址中取出8个字数据分别存放到r4-r11中
这时候r0的地址应该没有增加吧
态度决定一切
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-22 21:39:38 | 显示全部楼层
刚看了一下资料,基址寄存器会自增的。如果指向xPSR的话就没法出栈了,栈的话必须先进后出啊。
态度决定一切
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-12-22 22:27:53 | 显示全部楼层
回复【7楼】冰封嗜魔:
---------------------------------
恩恩,LDM     R0, {R4-R11}    应该是递增,而且R0的值是不变的,这样就对了。
太感谢了,O(∩_∩)O!
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-23 15:16:44 | 显示全部楼层
回复【9楼】jikaishihuaidan:
---------------------------------
呵呵,这就好呀,我的疑问也解决了。多讨论是好的。
态度决定一切
回复 支持 反对

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
发表于 2013-12-23 18:53:58 | 显示全部楼层
回复【10楼】冰封嗜魔:
---------------------------------
大哥,psp是什么,也是一个寄存器吗,我看手册上说的模糊啊,看不太明白。
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2385
金钱
2385
注册时间
2012-11-22
在线时间
403 小时
发表于 2013-12-23 19:22:13 | 显示全部楼层
回复【11楼】l692519765:
---------------------------------
R13:  两个堆栈指针 
? Cortex ‐ M3拥有两个堆栈指针,然而它们是 banked ,因此任一时刻只能使用其中的一个。?
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包
括中断服务例程)?
进程堆栈指针(PSP):由用户的应用程序代码使用。
态度决定一切
回复 支持 反对

使用道具 举报

78

主题

271

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2013-10-20
在线时间
36 小时
发表于 2013-12-23 19:42:01 | 显示全部楼层
回复【12楼】冰封嗜魔:
---------------------------------
谢谢。了解了。
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2014-6-22 16:24:05 | 显示全部楼层
回复【9楼】jikaishihuaidan:
---------------------------------
楼主好,我也刚好看到这里,看到楼主的帖子,不得不说,这应该是个正确的说法,我也是这么推断的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 02:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表