?? irq.inc
字號:
;/***************************************Copyright (c)****************************************************
;** Guangzhou ZHIYUAN electronics Co.,LTD.
;**
;** http://www.embedtools.com
;**
;**-------------File Info---------------------------------------------------------------------------------
;** File name: IRQ.inc
;** Latest modified Date: 2007-11-20
;** Latest Version: 1.0
;** Descriptions: 定義uC/OS-II中IRQ匯編接口代碼宏
;**
;**-------------------------------------------------------------------------------------------------------
;** Created by: Chenmingji
;** Created date: 2007-11-20
;** Version: 1.0
;** Descriptions: The original version
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified date:
;** Version:
;** Descriptions:
;**
;********************************************************************************************************/
;/********************************************************************************************************
; 宏定義
;********************************************************************************************************/
OSNoInt EQU 0x80
OSSYS32Mode EQU 0x1f
OSIRQ32Mode EQU 0x12
;/********************************************************************************************************
; 引入的外部標號在這聲明
;********************************************************************************************************/
IMPORT OSIntCtxSw ; 任務切換函數
IMPORT OSIntExit ; 中斷退出函數
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting ; 中斷嵌套計數器
IMPORT GulOsEnterSum
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 輸出的標號
$IRQ_Label
SUB LR, LR, #4 ; 計算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任務環境
MRS R3, SPSR ; 保存狀態
STMFD SP, {R3, SP, LR}^ ; 保存用戶狀態的R3,SP,LR,
; 注意不能回寫
; 如果回寫,結果未知
LDR R2, =GulOsEnterSum
MOV R1, #1
STR R1, [R2]
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
CMP R1, #0xff
ADDLO R1, R1, #1
STRLOB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(OSNoInt | OSSYS32Mode) ; 切換到系統模式
CMP R1, #1
LDREQ SP, =StackUsr
ISR $IRQ_Exception_Function ; 實際的IRQ處理程序
MSR CPSR_c, #(OSNoInt | OSSYS32Mode) ; 切換到系統模式
LDR R2, =GulOsEnterSum ; GulOsEnterSum,使OSIntExit退出時
; 中斷關閉
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =GulOsEnterSum ; 因為中斷服務程序要退出,
; 所以GulOsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(OSNoInt | OSIRQ32Mode) ; 切換回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢復用戶狀態的R3,SP,LR,
; 注意不能回寫P,
; 所以后面要調整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}^ ; 不進行任務切換
LDR PC, =OSIntCtxSw ; 進行任務切換
MEND
END
;/********************************************************************************************************
; END FILE
;********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -