?? irq.s
字號:
;/****************************************Copyright (c)**************************************************
;** 廣州周立功單片機(jī)發(fā)展有限公司
;** 研 究 所
;** 產(chǎn)品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: IRQ.s
;**創(chuàng) 建 人: 陳明計
;**最后修改日期: 2004年5月20日
;**描 述: 允許中斷嵌套時的IRQ句柄
;** 每個工程應(yīng)當(dāng)有獨立的這個文件的拷貝,并進(jìn)行相應(yīng)的修改
;**--------------歷史版本信息----------------------------------------------------------------------------
;** 創(chuàng)建人: 陳明計
;** 版 本: v1.0
;** 日 期: 2004年2月2日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陳明計
;** 版 本: v1.1
;** 日 期: 2004年5月26日
;** 描 述: 改進(jìn)HANDLER宏,使其更可靠
;**
;**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;引入的外部標(biāo)號在這聲明
IMPORT OSIntCtxSw ;任務(wù)切換函數(shù)
IMPORT OSIntExit ;中斷退出函數(shù)
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting ;中斷嵌套計數(shù)器
IMPORT StackUsr
IMPORT OsEnterSum
CODE32
AREA IRQ,CODE,READONLY
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 輸出的標(biāo)號
IMPORT $IRQ_Exception_Function ; 引用的外部標(biāo)號
$IRQ_Label
SUB LR, LR, #4 ; 計算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任務(wù)環(huán)境
MRS R3, SPSR ; 保存狀態(tài)
STMFD SP, {R3, SP, LR}^ ; 保存用戶狀態(tài)的R3,SP,LR,注意不能回寫
; 如果回寫的是用戶的SP,所以后面要調(diào)整SP
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統(tǒng)模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ; 調(diào)用c語言的中斷處理程序
LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出時中斷關(guān)閉
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ; 因為中斷服務(wù)程序要退出,所以O(shè)sEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切換回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢復(fù)用戶狀態(tài)的R3,SP,LR,注意不能回寫
; 如果回寫的是用戶的SP,所以后面要調(diào)整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不進(jìn)行任務(wù)切換
LDR PC, =OSIntCtxSw ; 進(jìn)行任務(wù)切換
MEND
;/* 以下添加中斷句柄,用戶根據(jù)實際情況改變 */
;/*中斷*/
IRQ_Handler HANDLER IRQ_Exception
;/*定時器0中斷*/
Timer0_Handler HANDLER Timer0_Exception
Usb_Handler HANDLER Usb_Exception
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -