?? os_cpu_a.s
字號(hào):
;/*
;*********************************************************************************************************
;* 文件: OS_CPU_A.S
;* 描述: uC/OS-II在 S3C2410 上的移植代碼匯編代碼部分.
;* 編寫: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/
AREA os_cpu_a, CODE, READONLY
CODE32
IMPORT OSTCBCur ; 指向當(dāng)前任務(wù)TCB的指針.
IMPORT OSTCBHighRdy ; 指向?qū)⒁\(yùn)行的任務(wù)TCB的指針.
IMPORT OSPrioCur ; 當(dāng)前任務(wù)的優(yōu)先級(jí).
IMPORT OSPrioHighRdy ; 將要運(yùn)行的任務(wù)的優(yōu)先級(jí).
IMPORT OSTaskSwHook ; 任務(wù)切換的鉤子函數(shù).
IMPORT OsEnterSum ; 關(guān)中斷計(jì)數(shù)器(關(guān)中斷信號(hào)量).
IMPORT OSRunning ; uC/OS-II運(yùn)行標(biāo)志.
EXPORT __OSIntCtxSw ; 中斷級(jí)任務(wù)切換函數(shù).
EXPORT OS_TASK_SW ; 任務(wù)級(jí)任務(wù)切換函數(shù).
EXPORT OSStartHighRdy ; 開始最高優(yōu)先級(jí)任務(wù).
EXPORT OS_ENTER_CRITICAL
EXPORT OS_EXIT_CRITICAL
NoInt EQU 0x80 ; 關(guān)中斷.
SYS32Mode EQU 0x1f ; 系統(tǒng)模式代碼.
IRQ32Mode EQU 0x12 ; IRQ中斷模式代碼.
SVC32Mode EQU 0x13 ; 管理模式代碼.
;/*******************************************************************************************************
;* 函數(shù): OS_ENTER_CRITICAL.
;* 描述: 關(guān) IRQ 中斷.
;*******************************************************************************************************/
OS_ENTER_CRITICAL
STMFD SP!, {R0,LR}
MRS R0, CPSR
ORR R0, R0, #(1<<7)
MSR CPSR_c, R0
LDR R0, =OsEnterSum
LDR R1, [R0]
ADD R1, R1, #1
STR R1, [R0]
LDMFD SP!, {R0,PC}
;/******************************************************************************************************
;* 函數(shù): OS_EXIT_CRITICAL.
;* 描述: 開 IRQ 中斷.
;******************************************************************************************************/
OS_EXIT_CRITICAL
STMFD SP!, {R0-R1,LR}
LDR R0, =OsEnterSum
LDR R1, [R0]
SUBS R1, R1, #1
STR R1, [R0]
MRS R0, CPSR
BICEQ R0, R0, #(1<<7)
MSREQ CPSR_c, R0
LDMFD SP!, {R0-R1,PC}
;/*
;*********************************************************************************************************
;* 函數(shù): __OSIntCtxSw.
;* 描述: IRQ 中斷級(jí)任務(wù)切換.
;*********************************************************************************************************
;*/
__OSIntCtxSw
STMFD SP!, {R0}
MOV R0, LR
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統(tǒng)模式.
STMFD SP!, {R0} ; 保存 PC.
STMFD SP!, {LR} ; 保存 LR.
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切回 IRQ 模式.
LDMFD SP!, {R0}
LDR LR, =OSCtxSw_01
STMFD SP!, {LR}
LDMFD SP!, {PC}^
;/*
;*********************************************************************************************************
;* 函數(shù): OS_TASK_SW.
;* 描述: 任務(wù)級(jí)任務(wù)切換.
;*********************************************************************************************************
;*/
OS_TASK_SW
STMFD SP!, {LR} ; 保存 PC.
STMFD SP!, {LR} ; 保存 LR.
OSCtxSw_01
STMFD SP!, {R0-R12} ; 保存 R12-R0.
LDR R0, =OsEnterSum
LDR R0, [R0]
MRS R1, CPSR
STMFD SP!, {R0-R1} ; 保存 CPSR,OsEnterSum.
LDR R1, =OSTCBCur
LDR R1, [R1]
STR SP, [R1] ; OSTCBCur->OSTCBStkPtr = SP.
BL OSTaskSwHook ; 調(diào)用鉤子函數(shù).
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 SP, [R1, #0] ; 獲取新任務(wù)堆棧指針 OSTCBHighRdy->OSTCBStkPtr.
LDMFD SP!, {R0-R1} ; 恢復(fù) CPSR,OsEnterSum.
LDR R2, =OsEnterSum
STR R0, [R2]
MSR CPSR_cxsf, R1
LDMFD SP!, {R0-R12,LR,PC} ; 恢復(fù) R12-R0,LR,PC.
;/*********************************************************************************************************
;* 函數(shù): OSStartHighRdy.
;* 描述: uC/OS-II啟動(dòng)時(shí)使用OSStartHighRdy運(yùn)行第一個(gè)任務(wù).
;*********************************************************************************************************/
OSStartHighRdy
BL OSTaskSwHook ; 調(diào)用鉤子函數(shù).
LDR R0, =OSRunning ; 告訴 uC/OS-II自身已經(jīng)運(yùn)行.
MOV R1, #1
STRB R1, [R0]
LDR R1, =OSTCBHighRdy
LDR R1, [R1]
B OSCtxSw_10
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -