?? os_cpu_a.s
字號:
;/*******************************************************************************************************
;* 文件名:os_cpu_a.s
;* 功 能: μCOS-II在LPC214X上的移植代碼匯編代碼部分,用ADS1.2編譯
;* 作 者:POWER
;* 日 期:2006年7月25號
;* 斯凱科技主頁:www.armsky.net
;* 斯凱科技論壇:www.armsky.net/bbs
;********************************************************************************************************/
;/* 定義系統(tǒng)模式堆棧的大小 */
SVC_STACK_LEGTH EQU 32
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;/* T_bit用于檢測進入異常前cpu是否處于THUMB狀態(tài) */
T_bit EQU 0x20
CODE32
AREA |subr|, CODE, READONLY
IMPORT OSTCBCur ;// 指向當前任務TCB的指針
IMPORT OSTCBHighRdy ;// 指向?qū)⒁\行的任務TCB的指針
IMPORT OSPrioCur ;// 當前任務的優(yōu)先級
IMPORT OSPrioHighRdy ;// 將要運行的任務的優(yōu)先級
IMPORT OSTaskSwHook ;// 任務切換的鉤子函數(shù)
IMPORT OSRunning ;// uC/OS-II運行標志
IMPORT OsEnterSum ;// 關中斷計數(shù)器(關中斷信號量)
IMPORT SWI_Exception ;// 軟中斷異常處理程序
EXPORT __OSStartHighRdy
EXPORT OSIntCtxSw ;// 中斷退出時的入口,參見startup.s中的IRQ_Handler
EXPORT SoftwareInterrupt ;// 軟中斷入口
;/*********************************************************************************************************
;* 函數(shù)名稱: SoftwareInterrupt
;* 功能描述: 軟件中斷,用于提供一些系統(tǒng)服務,功能參考os_cpu_c.c文件
;* 輸 入: 依功能而定
;* 輸 出 : 依功能而定
;**********************************************************************************************************/
;/* 軟件中斷 */
SoftwareInterrupt
LDR SP, StackSvc ;// 重新設置堆棧指針
STMFD SP!, {R0-R3, R12, LR}
MOV R1, SP ;// R1指向參數(shù)存儲位置
MRS R3, SPSR
TST R3, #T_bit ;// 中斷前是否是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為第一次任務切換
BL SWI_Exception
LDMFD SP!, {R0-R3, R12, PC}^
StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
;/*********************************************************************************************************
;* 函數(shù)名稱: OSIntCtxSw
;* 功能描述: 中斷退出時的入口
;* 輸 入: R3 :當前任務的狀態(tài)寄存器CPSR(即SPSR的值)
;* R4-R12:當前任務的R4-R11
;* 當前處理器模式的堆棧結構(出棧次序):R0-R3、R12、PC(當前任務的)
;* 輸 出 : 無
;* 全局變量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
;* 調(diào)用模塊: 無
;********************************************************************************************************/
OSIntCtxSw
;// 下面為保存任務環(huán)境
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
;// 保存當前任務堆棧指針到當前任務的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
;// 獲取新任務堆棧指針
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 ;// 設置堆棧指針
LDMFD SP!, {R4, R5} ;// CPSR,OsEnterSum
;// 恢復新任務的OsEnterSum
LDR R3, =OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5 ;// 恢復CPSR
LDMFD SP!, {R0-R12, LR, PC }^ ;// 運行新任務
;/*********************************************************************************************************
;* 函數(shù)名稱: __OSStartHighRdy
;* 功能描述: uC/OS-II啟動時使用OSStartHighRdy運行第一個任務,
;* OSStartHighRdy會調(diào)用__OSStartHighRdy
;* 輸 入: 無
;* 輸 出:無
;* 全局變量: OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
;* 調(diào)用模塊: OSTaskSwHook
;********************************************************************************************************/
__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 ;// 管理模式堆??臻g
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -