📄 os_cpu_a.s
字号:
;/*
;*********************************************************************************************************
;* 文件: OS_CPU_A.S
;* 描述: uC/OS-II在 LPC210X 上的移植代码汇编代码部分.
;* 编写: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/
AREA os_cpu_a, CODE, READONLY
CODE32
IMPORT OSTCBCur ; 指向当前任务TCB的指针.
IMPORT OSTCBHighRdy ; 指向将要运行的任务TCB的指针.
IMPORT OSPrioCur ; 当前任务的优先级.
IMPORT OSPrioHighRdy ; 将要运行的任务的优先级.
IMPORT OSTaskSwHook ; 任务切换的钩子函数.
IMPORT OsEnterSum ; 关中断计数器(关中断信号量).
IMPORT OSRunning ; uC/OS-II运行标志.
EXPORT OSIntCtxSw2 ; 中断级任务切换函数.
EXPORT OSCtxSw ; 任务级任务切换函数.
EXPORT OSStartHighRdy2 ; 开始最高优先级任务.
NoInt EQU 0x80 ; 关中断.
SYS32Mode EQU 0x1f ; 系统模式代码.
IRQ32Mode EQU 0x12 ; IRQ中断模式代码.
SVC32Mode EQU 0x13 ; 管理模式代码.
;/*
;*********************************************************************************************************
;* 函数: OSIntCtxSw2.
;* 描述: IRQ 中断级任务切换.
;*********************************************************************************************************
;*/
OSIntCtxSw2
STMFD SP!, {R0-R1}
MRS R0, SPSR
MOV R1, LR
MSR CPSR_c, #(NoInt | SVC32Mode) ; 切到管理模式.
MOV LR, R1
MSR SPSR_cxsf, R0
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切回 IRQ 模式.
LDMFD SP!, {R0-R1}
B OSCtxSw
;/*
;*********************************************************************************************************
;* 函数: OSCtxSw.
;* 描述: 任务级任务切换.
;*********************************************************************************************************
;*/
OSCtxSw
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式.
STMFD SP!, {R0-R12,R14} ; 保存 LR.R12-R0.
MOV R0, SP
MSR CPSR_c, #(NoInt | SVC32Mode) ; 切回管理模式.
MOV R12, LR
MRS R11, SPSR
LDR R10, =OsEnterSum
LDR R10, [R10]
STMFD R0!, {R10-R12} ; 保存 PC,CPSR,OsEnterSum.
LDR R1, =OSTCBCur
LDR R1, [R1]
STR R0, [R1] ; OSTCBCur->OSTCBStkPtr = SP.
BL OSTaskSwHook ; 调用钩子函数.
LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy.
LDR R1, =OSPrioHighRdy
LDRB R1, [R1]
STRB R1, [R0]
LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy.
LDR R1, =OSTCBHighRdy
LDR R1, [R1]
STR R1, [R0]
OSCtxSw_10
LDR R0, [R1, #0] ; 获取新任务堆栈指针 OSTCBHighRdy->OSTCBStkPtr.
LDMFD R0!, {R10-R12} ; 恢复 PC,SPSR,OsEnterSum.
LDR R1, =OsEnterSum
STR R10, [R1]
MSR SPSR_cxsf, R11
MOV LR, R12
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式.
MOV SP, R0
LDMFD SP!, {R0-R12,R14} ; 恢复 LR.R12-R0.
MSR CPSR_c, #(NoInt | SVC32Mode) ; 进入管理模式.
MOVS PC, LR ; 运行新任务.
;/*
;*********************************************************************************************************
;* 函数: OSStartHighRdy2.
;* 描述: OS 启动时通过调用此程序切换到当前最高级任务.
;*********************************************************************************************************
;*/
OSStartHighRdy2
BL OSTaskSwHook ; 调用钩子函数.
LDR R0, =OSRunning ; 告诉 uC/OS-II自身已经运行.
MOV R1, #1
STRB R1, [R0]
LDR R1, =OSTCBHighRdy
LDR R1, [R1]
B OSCtxSw_10
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -