📄 irq.inc
字号:
;/****************************************Copyright (c)**************************************************
;** zhuhai creawor Development Co.,LTD.
;** graduate school
;** http://www.creawor.com
;**
;**----------------------------------------------文件信息------------------------------------------------
;**文 件 名: IRQ.inc
;**创 建 人:
;**最后修改日期: 2004年8月27日
;**描 述: 定义IRQ汇编接口代码宏
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;/********************************************************************************************************
;** 引入的外部标号在这声明
;********************************************************************************************************/
IMPORT OSIntCtxSw ;//任务切换函数
IMPORT OSIntEnter ;//进入中断函数
IMPORT OSIntExit ;//中断退出函数
IMPORT OSIntNesting ;//中断嵌套计数器
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT StackUsr
IMPORT OsEnterSum
;/********************************************************************************************************
;** IRQ 异常处理宏汇编代码
;********************************************************************************************************/
CODE32
AREA IRQ,CODE,READONLY
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ;// 输出的标号
IMPORT $IRQ_Exception_Function ;// 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ;// 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ;// 保存任务环境
MRS R3, SPSR ;// 保存状态
STMFD SP, {R3, SP, LR}^ ;// 保存用户状态的R3,SP,LR,注意不能回写
;// 如果回写的是用户的SP,所以后面要调整SP
;LDR R2, =OSIntNesting ;// OSIntNesting++
;LDRB R1, [R2]
;ADD R1, R1, #1
;STRB R1, [R2]
BL OSIntEnter ;//这句话可以用上面屏蔽掉的四句话代替
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ;// 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ;// 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | SYS32Mode) ;// 切换到系统模式
LDR R2, =OsEnterSum ;// OsEnterSum,使OSIntExit退出时中断关闭
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ;// 因为中断服务程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ;// 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ;// 恢复用户状态的R3,SP,LR,注意不能回写
;// 如果回写的是用户的SP,所以后面要调整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 Of File
;*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -