📄 irq.inc
字号:
;/*********************************************************************************************************
;** Small RTOS
;** The Real-Time Kernel
;** (c) Copyright 2004-2004, chenmingji
;** All Rights Reserved
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: irq.inc
;**创 建 人: 陈明计
;**最后修改日期: 2005年6月10日
;**描 述: Small RTOS V1.50在ARM7上的IRQ接口部分,用ADS1.2编译
;**
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本: V1.0
;** 日 期: 2005年6月10日
;** 描 述: 原始版
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人:
;** 版 本:
;** 日 期:
;** 描 述:
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
;引入的外部标号在这声明
IMPORT __OSIntCtxSw ;中断中任务切换函数
IMPORT OSIntNesting ;中断嵌套计数器
; IMPORT OsEnterSum ;禁止中断嵌套计数器
IMPORT OSIntExit ;中断退出处理程序
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]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
CMP R1, #1
LDREQ SP, =StackIrq1
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
BL OSIntExit ; 调用中断退出处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢复用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
CMP R0, #0
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
; LDR R3, =OsEnterSum ; OsEnterSum = 0
; MOV R0, #0
; STRB R0, [R3]
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =__OSIntCtxSw ; 进行任务切换
MEND
;/*********************************************************************************************************/
AREA IRQ_Stack,DATA, NOINIT, ALIGN=2
StackIrq1
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -