?? os_cpu_a.s
字號:
AREA os_cpu_a, CODE, READONLY
CODE32
IMPORT OSTCBCur ; 指向當(dāng)前任務(wù)TCB的指針.
IMPORT OSTCBHighRdy ; 指向?qū)⒁\行的任務(wù)TCB的指針.
IMPORT OSPrioCur ; 當(dāng)前任務(wù)的優(yōu)先級.
IMPORT OSPrioHighRdy ; 將要運行的任務(wù)的優(yōu)先級.
IMPORT OSTaskSwHook ; 任務(wù)切換的鉤子函數(shù).
IMPORT OsEnterSum ; 關(guān)中斷計數(shù)器(關(guān)中斷信號量).
IMPORT OSRunning ; uC/OS-II運行標(biāo)志.
IMPORT SWI_Exception
EXPORT OSIntCtxSw ; 中斷級任務(wù)切換函數(shù).
EXPORT OS_TASK_SW ; 任務(wù)級任務(wù)切換函數(shù).
EXPORT OSStartHighRdy ; 開始最高優(yōu)先級任務(wù).
EXPORT SoftwareInterrupt
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 ; 管理模式代碼.
SVC_STACK_LEGTH EQU 32
;/*********************************************************************************************************
;** 函數(shù)名稱: SoftwareInterrupt
;** 功能描述: 軟件中斷,用于提供一些系統(tǒng)服務(wù),功能參考o(jì)s_cpu_c.c文件
;** 輸 入: 依功能而定
;** 輸 出 : 依功能而定
;** 全局變量: 無
;** 調(diào)用模塊: SWI_Exception
;**
;** 作 者: 陳明計
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計
;** 日 期: 2003年6月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計
;** 日 期: 2003年6月19日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;軟件中斷
SoftwareInterrupt
LDR SP, StackSvc ; 重新設(shè)置堆棧指針
STMFD SP!, {R0-R3, R12, LR}
MOV R1, SP ; R1指向參數(shù)存儲位置
MRS R3, SPSR
TST R3, #0x20 ; 中斷前是否是Thumb狀態(tài)
LDRNEH R0, [LR,#-2] ; 是: 取得Thumb狀態(tài)SWI號
BICNE R0, R0, #0xff00
LDREQ R0, [LR,#-4] ; 否: 取得arm狀態(tài)SWI號
BICEQ R0, R0, #0xFF000000
; r0 = SWI號,R1指向參數(shù)存儲位置
CMP R0, #1
LDRLO PC, =OSIntCtxSw
LDREQ PC, =OSStartHighRdy ; SWI 0x01為第一次任務(wù)切換
BL SWI_Exception
LDMFD SP!, {R0-R3, R12, PC}^
StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
;/*******************************************************************************************************
;* 函數(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 中斷級任務(wù)切換.
;*********************************************************************************************************
;*/
OSIntCtxSw
LDR R2, [SP, #20] ;獲取PC
LDR R12, [SP, #16] ;獲取R12
MRS R0, CPSR
MSR CPSR_c, #(NoInt | SYS32Mode)
MOV R1, LR
STMFD SP!, {R1-R2} ;保存LR,PC
STMFD SP!, {R4-R12} ;保存R4-R12
MSR CPSR_c, R0
LDMFD SP!, {R4-R7} ;獲取R0-R3
ADD SP, SP, #8 ;出棧R12,PC
MSR CPSR_c, #(NoInt | SYS32Mode)
STMFD SP!, {R4-R7} ;保存R0-R3
LDR R1, =OsEnterSum ;獲取OsEnterSum
LDR R2, [R1]
STMFD SP!, {R2, R3} ;保存CPSR,OsEnterSum
;保存當(dāng)前任務(wù)堆棧指針到當(dāng)前任務(wù)的TCB
LDR R1, =OSTCBCur
LDR R1, [R1]
STR SP, [R1]
BL OSTaskSwHook ;調(diào)用鉤子函數(shù)
;OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
OSIntCtxSw_1
;獲取新任務(wù)堆棧指針
LDR R4, [R6]
ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode) ;進入管理模式
MOV SP, R4 ;設(shè)置堆棧指針
LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum
;恢復(fù)新任務(wù)的OsEnterSum
LDR R3, =OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5 ;恢復(fù)CPSR
LDMFD SP!, {R0-R12, LR, PC }^ ;運行新任務(wù)
;/*
;*********************************************************************************************************
;* 函數(shù): OS_TASK_SW.
;* 描述: 任務(wù)級任務(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啟動時使用OSStartHighRdy運行第一個任務(wù).
;*********************************************************************************************************/
OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
;告訴uC/OS-II自身已經(jīng)運行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
BL OSTaskSwHook ;調(diào)用鉤子函數(shù)
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
B OSIntCtxSw_1
AREA SWIStacks, DATA, NOINIT,ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆棧空間
END
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -