📄 taskctxsw.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 + -