⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskctxsw.s

📁 Rabbit 32Bit RTOS源代码
💻 S
字号:
;*********************************************************************
;*                  Copyright (c) 2011-2012,李士伟
;*                    All rights reserved.
;*文 件 名:TaskCtxSw.s
;*描    述:任务切换汇编代码
;*当前版本:V1.00
;*作    者:李士伟
;*创建日期:2011.10.01
;*********************************************************************
; 汇编代码使用到的与处理器相关的宏定义
    GET arch\lpc2103\asm_cpu.inc
; 引出内部函数标号
    EXPORT  __OS_StartHighRdyTask
    EXPORT  __OS_TaskCtxSw
    EXPORT  __OS_IntCtxSw


; 引入外部全局变量标号
    IMPORT  OSEnterSum
    IMPORT  OSTCBCur
    IMPORT  OSTCBHighRdy


    CODE32
    PRESERVE8
    AREA    ContextSwitch, CODE, READONLY

;**********************************************
;* 启动高优先级就绪任务
;* 系统启动第一个任务,或任务删除自身时调用它
;* 该过程不保存当前的任务环境
;* 只是切换到启动的任务环境
;**********************************************
__OS_StartHighRdyTask
    MSR    CPSR_c, #(I_Bit | SYS32_MODE)
; 切换到新任务环境 
;OSTCBCur = OSTCBHighRdy
    LDR   R0, =OSTCBCur
    LDR   R1, =OSTCBHighRdy
    LDR   R6, [R1]
    STR   R6, [R0]

    LDR   R0, [R6]                          ; 从新任务TCB中获得SP  
    ADD   SP, R0, #68                       ; 恢复SP
    LDR   LR, [SP, #-8]
    MSR   CPSR_c, #(I_Bit | SVC32_MODE)     ; 切换到管理模式
    LDMFD R0!, {R1, R2}                     ; 出栈OSEnterSum, SPSR
    LDR   R3, =OSEnterSum
    STR   R1, [R3]
    MSR   SPSR_cxsf, R2                     ; 恢复CPSR
    LDMFD R0, {R0-R12, LR, PC}^             ; 恢复寄存器,并运行新任务

;**********************************************
;* 任务级上下文切换
;**********************************************
__OS_TaskCtxSw
; 保存任务环境
    LDR  R4,  [SP, #12]                     ; 获取PC
    LDR  R12, [SP, #8]                      ; 获取R12
    MRS  R5,  CPSR                          ; R5用于返回当前模式

    MSR    CPSR_c, #(I_Bit | SYS32_MODE)    ; 切换到系统模式
    STMFD  SP!, {R4}                        ; 保存用户断点地址PC
    STMFD  SP!, {R6-R12, LR}                ; 保存用户R6-R12,LR
    
    MSR    CPSR_c, R5                       ; 返回切换前的模式
    LDMFD  SP!, {R6-R7, R12, LR}            ; 获取R4-R5,并出栈R12,PC
    MRS    R5, SPSR 
    
    MSR    CPSR_c, #(I_Bit | SYS32_MODE)    ; 切换到系统模式
    STMFD  SP!, {R0-R3, R6-R7}              ; 保存R0-R3, R4-R5
    LDR    R4, =OSEnterSum
    LDR    R4, [R4]
    STMFD  SP!, {R4-R5}                     ; 保存OSEnterSum,CPSR

; 保存当前任务栈指针到当前任务的TCB
    LDR   R0, =OSTCBCur
    LDR   R1, [R0]
    STR   SP, [R1]

; 切换到新任务环境
;OSTCBCur = OSTCBHighRdy
    LDR   R0, =OSTCBCur
    LDR   R1, =OSTCBHighRdy
    LDR   R6, [R1]
    STR   R6, [R0]

    LDR   R0, [R6]                          ; 从新任务TCB中获得SP
    ADD   SP, R0, #68                       ; 恢复SP
    LDR   LR, [SP, #-8]
    MSR   CPSR_c, #(I_Bit | SVC32_MODE)     ; 切换到管理模式
    LDMFD R0!, {R1, R2}                     ; 出栈OSEnterSum, SPSR
    LDR   R3, =OSEnterSum
    STR   R1, [R3]
    MSR   SPSR_cxsf, R2                     ; 恢复CPSR
    LDMFD R0, {R0-R12, LR, PC}^             ; 恢复寄存器,并运行新任务


;**********************************************
;* 中断级上下文切换
;**********************************************
__OS_IntCtxSw
; 保存任务环境
    LDR   R1,  [SP, #20]                    ; 获取PC
    LDR   R12, [SP, #16]                    ; 获取R12
    MRS   R2,  CPSR                         ; R2用于返回当前的模式
    MSR   CPSR_c, #(I_Bit | SYS32_MODE)     ; 切换到系统模式
    MOV   R0, LR
    STMFD SP!, {R0, R1}                     ; 保存LR,PC
    STMFD SP!, {R4-R12}	                    ; 保存R4~R12
    MSR   CPSR_c, R2                        ; 返回切换前的模式
    LDMFD SP!, {R4-R7}                      ; 获取R0~R3
    ADD   SP, SP, #8                        ; 出栈R12,PC	
    MSR   CPSR_c, #(I_Bit | SYS32_MODE)     ; 切换到系统模式
    LDR   R1, =OSEnterSum
    LDR   R2, [R1]
    STMFD SP!, {R2-R7}                      ; 保存OSEnterSum,CPSR,R0-R3
;保存当前任务栈指针到当前任务的TCB
    LDR   R0, =OSTCBCur
    LDR   R1, [R0]
    STR   SP, [R1]
;OSTCBCur = OSTCBHighRdy
    LDR   R0, =OSTCBCur
    LDR   R1, =OSTCBHighRdy
    LDR   R6, [R1]
    STR   R6, [R0]
; 切换到新任务环境
    LDR   R0, [R6]                          ; 从新任务TCB中获得SP  
    ADD   SP, R0, #68                       ; 恢复SP
    LDR   LR, [SP, #-8]
    MSR   CPSR_c, #(I_Bit | SVC32_MODE)     ; 切换到管理模式 
    MOV   SP,  R0
    LDMFD SP!, {R1, R2}	                    ; 出栈OSEnterSum, SPSR
    LDR   R3, =OSEnterSum
    STR   R1, [R3]
    MSR   SPSR_cxsf, R2                     ; 恢复CPSR
    LDMFD SP, {R0-R12, LR, PC}^            ; 恢复寄存器,并运行新任务

    END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -