OpenEdv-开源电子网

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

ucos上下文切换

[复制链接]

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-9-28
在线时间
17 小时
发表于 2016-12-12 11:01:51 | 显示全部楼层 |阅读模式
10金钱
有两个问题请教一下大神!!!

-->1
在ucos中的上下文切换时发生在pendSV异常中,代码见下:

PendSV_Handler
    CPSID   I                                                      ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0,  PendSV_Handler_nosave                  ;OS_CPU_PendSVHandler_nosave                     Skip register save the first time

    SUBS    R0, R0, #0x20                                    ; Save remaining regs r4-11 on process stack
    STM     R0, {R4-R11}

    LDR     R1, =OSTCBCur                                  ; OSTCBCur->OSTCBStkPtr = SP;
    LDR     R1, [R1]
    STR     R0, [R1]                                            ; R0 is SP of process being switched out

                                                                     ; At this point, entire context of process has been saved
;OS_CPU_PendSVHandler_nosave
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
    ADDS    R0, R0, #0x20
    MSR     PSP, R0                                                ; Load PSP with new process SP
    ORR     LR, LR, #0x04                                       ; Ensure exception return uses process stack
    CPSIE   I
    BX      LR                                                       ; Exception return will restore remaining context

   ; END


问题:假如在任务A的某处发生了pendSV异常,则LR此时存储的是该处的地址,而在pendSV中对任务栈等信息处理了,但是没有更改LR的值,那么在pendSV处理结束的时刻我们看到有条
    BX      LR    指令, 那岂不是又回到了任务A的这个地方呀,怎么能切换到别的任务上去啊??????

---->问题2:
参见附件:
图示中上下文切换为什么会回到任务B呀?不是IRQ一直悬起了,上下文切换完后,立刻应该进入到IRQ而不是进入到任务B啊。



上下文切换

上下文切换

最佳答案

查看完整内容[请看2#楼]

已经解决了 谢谢大家关注
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-9-28
在线时间
17 小时
 楼主| 发表于 2016-12-12 11:01:52 | 显示全部楼层
已经解决了 谢谢大家关注
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-12-12 20:46:48 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

10

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-11-29
在线时间
5 小时
发表于 2017-1-8 16:44:07 | 显示全部楼层
已经解决了,谢谢大家的关注
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-10-19
在线时间
1 小时
发表于 2019-10-19 15:56:08 | 显示全部楼层
请问这个到底是为什么呢?进入上下文切换的时候,为什么只保存了R4-R11,R12-R15这几个寄存器为什么不保存呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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