?? irq.inc
字號(hào):
;/****************************************Copyright (c)**************************************************
;** 廣州周立功單片機(jī)發(fā)展有限公司
;** 研 究 所
;** 產(chǎn)品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: IRQ.inc
;**創(chuàng) 建 人: 陳明計(jì)
;**最后修改日期: 2004年8月27日
;**描 述: 定義IRQ匯編接口代碼宏
;**
;**--------------歷史版本信息----------------------------------------------------------------------------
;** 創(chuàng)建人: 陳明計(jì)
;** 版 本: v1.0
;** 日 期: 2004年8月27日
;** 描 述: 原始版本
;**
;**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;引入的外部標(biāo)號(hào)在這聲明
IMPORT OSIntCtxSw ;任務(wù)切換函數(shù)
IMPORT OSIntExit ;中斷退出函數(shù)
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting ;中斷嵌套計(jì)數(shù)器
IMPORT StackUsr
IMPORT OsEnterSum
CODE32
AREA IRQ,CODE,READONLY
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 輸出的標(biāo)號(hào)
IMPORT $IRQ_Exception_Function ; 引用的外部標(biāo)號(hào)
$IRQ_Label
SUB LR, LR, #4 ; 計(jì)算返回地址
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語(yǔ)言的中斷處理程序
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統(tǒng)模式
LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出時(shí)中斷關(guān)閉
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ; 因?yàn)橹袛喾?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
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -