?? os_cpu_a.s
字號(hào):
;/****************************************Copyright (c)**************************************************
;** 廣州周立功單片機(jī)發(fā)展有限公司
;** 研 究 所
;** 產(chǎn)品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: os_cpu_s.s
;**創(chuàng) 建 人: 陳明計(jì)
;**最后修改日期: 2003年6月19日
;**描 述: μCOS-II在LPC210x上的移植代碼匯編代碼部分,用ADS1.2編譯
;**
;**--------------歷史版本信息----------------------------------------------------------------------------
;** 創(chuàng)建人: 陳明計(jì)
;** 版 本: V1.0
;** 日 期: 2003年6月5日
;** 描 述: 原始版
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計(jì)
;** 版 本: V1.1
;** 日 期: 2003年6月11日
;** 描 述: 配合Vectors.s更正IRQ嵌套的BUG而作相應(yīng)的修改
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計(jì)
;** 版 本: V1.2
;** 日 期: 2003年6月13日
;** 描 述: 按照μCOS-II V2.52的要求修改(以前是基于μCOS-II V2.0)
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計(jì)
;** 版 本: V1.3
;** 日 期: 2003年6月19日
;** 描 述: 不完全按照μCOS-II V2.52的要求以提高效率
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計(jì)
;** 版 本: V1.3
;** 日 期: 2004年8月27日
;** 描 述: 提高SWI異常服務(wù)程序的效率
;**
;**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;T_bit用于檢測(cè)進(jìn)入異常前cpu是否處于THUMB狀態(tài)
T_bit EQU 0x20
CODE32
AREA |subr|, CODE, READONLY
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 OSRunning ;uC/OS-II運(yùn)行標(biāo)志
IMPORT OsEnterSum ;關(guān)中斷計(jì)數(shù)器(關(guān)中斷信號(hào)量)
IMPORT OSIntNesting
IMPORT _OSFunctionAddr
IMPORT _UsrFunctionAddr
IMPORT _TaskIsARM
IMPORT _TaskIsTHUMB
EXPORT __OSStartHighRdy
EXPORT OSIntCtxSw ;中斷退出時(shí)的入口,參見startup.s中的IRQ_Handler
EXPORT SoftwareInterrupt ;軟中斷入口
;/*********************************************************************************************************
;** 函數(shù)名稱: SoftwareInterrupt
;** 功能描述: 軟件中斷,用于提供一些系統(tǒng)服務(wù),功能參考o(jì)s_cpu_c.c文件
;** 輸 入: 依功能而定
;** 輸 出 : 依功能而定
;** 全局變量: 無
;** 調(diào)用模塊: SWI_Exception
;**
;** 作 者: 陳明計(jì)
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月19日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2004年8月27日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;軟件中斷
SoftwareInterrupt
CMP R0, #12
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD TASK_SW ;0
DCD ENTER_CRITICAL ;1
DCD EXIT_CRITICAL ;2
DCD ISRBegin ;3
DCD ChangeToSYSMode ;4
DCD ChangeToUSRMode ;5
DCD __OSStartHighRdy ;6
DCD TaskIsARM ;7
DCD TaskIsTHUMB ;8
DCD OSISRNeedSwap ;9
DCD GetOSFunctionAddr ;10
DCD GetUsrFunctionAddr ;11
TASK_SW
MRS R3, SPSR ;保存任務(wù)的CPSR
MOV R2, LR ;保存任務(wù)的PC
MSR CPSR_c, #(NoInt | SYS32Mode) ;切換到系統(tǒng)模式
STMFD SP!, {R2} ;保存PC到堆棧
STMFD SP!, {R0-R12, LR} ;保存R0-R12,LR到堆棧
;因?yàn)镽0~R3沒有保存有用數(shù)據(jù),所以可以這樣做
B OSIntCtxSw_0 ;真正進(jìn)行任務(wù)切換
ENTER_CRITICAL
;OsEnterSum++
LDR R1, =OsEnterSum
LDRB R2, [R1]
ADD R2, R2, #1
STRB R2, [R1]
;關(guān)中斷
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
EXIT_CRITICAL
;OsEnterSum--
LDR R1, =OsEnterSum
LDRB R2, [R1]
SUB R2, R2, #1
STRB R2, [R1]
;if(OsEnterSum == 0) 開中斷;
CMP R2, #0
MRSEQ R0, SPSR
BICEQ R0, R0, #NoInt
MSREQ SPSR_c, R0
MOVS PC, LR
ISRBegin
;OSIntNesting++
LDR R1, =OSIntNesting
LDRB R2, [R1]
ADD R2, R2, #1
STRB R2, [R1]
MOVS PC, LR
ChangeToSYSMode
;切換到系統(tǒng)模式
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #SYS32Mode
MSR SPSR_c, R0
MOVS PC, LR
ChangeToUSRMode
;切換到用戶模式
MRS R0, SPSR
BIC R0, R0, #0x1f
ORR R0, R0, #USR32Mode
MSR SPSR_c, R0
MOVS PC, LR
;_OSStartHighRdy
; B __OSStartHighRdy
TaskIsARM
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統(tǒng)模式
MOV R0, R1
BL _TaskIsARM
MSR CPSR_c, #(NoInt | SVC32Mode) ; 切換回管理模式
MOVS PC, LR
TaskIsTHUMB
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統(tǒng)模式
MOV R0, R1
BL _TaskIsTHUMB
MSR CPSR_c, #(NoInt | SVC32Mode) ; 切換回管理模式
MOVS PC, LR
OSISRNeedSwap
LDR R1, =OSTCBHighRdy
LDR R2, =OSTCBCur
CMP R1, R2
MOVEQ R0, #0
MOVNE R0, #1
MOVS PC, LR
GetOSFunctionAddr
LDR R1, =_OSFunctionAddr
LDR R0, [R1,R0,LSL #2]
MOVS PC, LR
GetUsrFunctionAddr
LDR R1, =_UsrFunctionAddr
LDR R0, [R1,R0,LSL #2]
MOVS PC, LR
;/*********************************************************************************************************
;** 函數(shù)名稱: OSIntCtxSw
;** 功能描述: 中斷退出時(shí)的入口
;** 輸 入: R3 :當(dāng)前任務(wù)的狀態(tài)寄存器CPSR(即SPSR的值)
;** R4-R12:當(dāng)前任務(wù)的R4-R11
;** 當(dāng)前處理器模式的堆棧結(jié)構(gòu)(出棧次序):R0-R3、R12、PC(當(dāng)前任務(wù)的)
;** 輸 出 : 無
;** 全局變量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
;** 調(diào)用模塊: 無
;**
;** 作 者: 陳明計(jì)
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月19日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSIntCtxSw
;下面為保存任務(wù)環(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
OSIntCtxSw_0
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) ;進(jìn)入管理模式
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 }^ ;運(yùn)行新任務(wù)
;/*********************************************************************************************************
;** 函數(shù)名稱: __OSStartHighRdy
;** 功能描述: uC/OS-II啟動(dòng)時(shí)使用OSStartHighRdy運(yùn)行第一個(gè)任務(wù),
;** OSStartHighRdy會(huì)調(diào)用__OSStartHighRdy
;** 輸 入: 無
;** 輸 出 : 無
;** 全局變量: OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
;** 調(diào)用模塊: OSTaskSwHook
;**
;** 作 者: 陳明計(jì)
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陳明計(jì)
;** 日 期: 2003年6月13日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
;告訴uC/OS-II自身已經(jīng)運(yùn)行
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
BL OSTaskSwHook ;調(diào)用鉤子函數(shù)
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
B OSIntCtxSw_1
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -