野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10802|回复: 2

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

[复制链接]
发表于 2016-10-11 14:50:30 | 显示全部楼层 |阅读模式
本帖最后由 yukang1744 于 2016-10-11 15:51 编辑

UCOS/III 是在PendSV中断里切换任务的,最后BX      LR(见红色字体),LR是旧任务返回地址, 所以是跳到旧任务继续执行,为什么会跳转到新任务了呢?还有蓝色字体,怎么能修改返回地址?如此修改,说是为了使用进程PSP,但程序返回还能正常运行吗?
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




回复

使用道具 举报

发表于 2016-10-11 18:26:27 | 显示全部楼层
看看火哥刚发的帖子,刚好有介绍
UCOSIII移植中的汇编接口函数讲解:OS_CPU_PendSVHandler加OS_CPU_PendSVHandler
http://www.firebbs.cn/forum.php? ... 4558&fromuid=64
(出处: 野火论坛)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-12 10:46:21 | 显示全部楼层

没有理解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,程序正确返回。

普通程序调用,子程序最后一句也是 BX      LR ,这个LR值是程序返回地址。 中断返回地址是从栈上弹出来的。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 08:58 , Processed in 0.028278 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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