你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

UCOS/III如何切换到新任务?

[复制链接]
yukang1744 提问时间:2016-10-11 15:04 /
本帖最后由 yukang1744 于 2016-10-11 15:05 编辑

UCOS/III 是在PendSV中断里切换任务的,最后BX      LR(见红色字体),LR是旧任务返回地址, 所以应该跳到旧任务继续执行,为什么会跳转到新任务了呢?希望高手能解惑。PendSV中断代码如下(摘自开发板例程):
OS_CPU_PendSVHandler
    CPSID   I                                                   ; Prevent interruption during context switch
    MRS     R0, PSP                                             ; PSP is process stack pointer
    CBZ     R0, 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, =OSTCBCurPtr                                    ; OSTCBCurPtr->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
    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, =OSTCBCurPtr                                    ; OSTCBCurPtr = OSTCBHighRdyPtr;
    LDR     R1, =OSTCBHighRdyPtr
    LDR     R2, [R1]
    STR     R2, [R0]

    LDR     R0, [R2]                                            ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr;
    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

收藏 评论2 发布时间:2016-10-11 15:04

举报

2个回答
moyanming2013 回答时间:2016-10-11 15:52:10
BX LR是切换到调用pendsv的地方了,不是任务地址。
yukang1744 回答时间:2016-10-12 10:41:47
没有理解cortex内核中断执行过程,就会产生这个疑问。
cortex内核产生中断时,自动将R0~R3、R12、LR、PC、XPSR这8个寄存器压入当前的堆栈,然后执行中断服务程序。进入中断服务例程后,LR中保存的不是返回地址,而是返回时所使用的芯片模式和堆栈寄存器的标示,只能是0xFFFFFFF1、0xFFFFFFF9或者是0xFFFFFFFD这3个值中的一个,因此可以ORR     LR, LR, #0x04,进行堆栈选择。
cortex内核芯片如何从中断中返回?中断执行结束后,R0~R3、R12、LR、PC、XPSR出栈,LR值赋给PC,程序正确返回。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版