📄 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,
; 注意不能回写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 FILE
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -