STM32
直播中

youyoulan

12年用户 1134经验值
私信 关注
[问答]

请问UCOSIII如何切换到新任务?


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

   


回帖(1)

王璐

2024-5-9 16:22:38
UCOSIII 是一个实时操作系统,它使用 PendSV 异常(一种软件中断)来实现任务切换。在 PendSV 中断处理程序中,操作系统会保存当前任务的上下文,然后恢复新任务的上下文,从而实现任务切换。

关于您提到的 "BX LR" 指令,它的作用是跳转到 LR 寄存器指向的地址继续执行。在 PendSV 中断处理程序中,LR 寄存器的值被修改为指向新任务的入口地址。因此,执行 "BX LR" 指令后,CPU 会跳转到新任务的入口地址,开始执行新任务。

以下是 UCOSIII 任务切换的大致步骤:

1. 当需要切换任务时,操作系统会触发 PendSV 异常。
2. 在 PendSV 异常处理程序中,首先会保存当前任务的上下文(如寄存器值等)。
3. 然后,操作系统会查找就绪任务队列,找到最高优先级的任务,并将其状态设置为 "正在运行"。
4. 接下来,操作系统会恢复新任务的上下文,包括修改 LR 寄存器的值为新任务的入口地址。
5. 最后,执行 "BX LR" 指令,跳转到新任务的入口地址,开始执行新任务。

这样,UCOSIII 就实现了从旧任务到新任务的切换。希望这个解释能帮助您理解 UCOSIII 的任务切换机制。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分