论坛元老 
   
	- 积分
 - 6662
 
        - 金钱
 - 6662 
 
       - 注册时间
 - 2016-5-29
 
      - 在线时间
 - 910 小时
 
 
 
 | 
 
 
发表于 2017-12-22 09:03:48
|
显示全部楼层
 
 
 
MSP 可以不用初始化.系统硬件自动搞定了. 
PSP 初始化为0,是用来区别,是不是第一次切换任务, 
因为第一次切换任务,无上一次任务来保存.不然,要保存上一个任务到栈. 
PendSV_Handler 
    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 这里会判断 PSP 是不是0,是0直接跳到OS_CPU_PendSVHandler_nosave  执行. 
  ;保存一下现场 
    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 
            
    OS_CPU_PendSVHandler_nosave 
 
    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 
     ALIGN 
    END |   
 
 
 
 |