📄 irq.s
字号:
;/*
;*********************************************************************************************************
;* 文件: IRQ.S
;* 描述: IRQ 中断入口函数, 具体 IRQ 中断服务功能函数在相应服务函数中实现(参考 OSTickISR 函数).
; 采用了一个宏做为向量服务程序的入口, 所以必须将入口值设置为 ISR 的具体地址值.
; 未用的向量中断均指向 RStartup 处(即软复位).
;* 编写: kaka (sn.kaka@yahoo.com).
;*********************************************************************************************************
;*/
IMPORT OSTCBCur ; 指向当前任务TCB的指针
IMPORT OSTCBHighRdy ; 指向将要运行的任务TCB的指针
IMPORT __OSIntCtxSw ; 中断级任务切换函数.
IMPORT OsEnterSum
AREA IRQMACRO,CODE,READONLY
CODE32
MACRO
$HandlerT HANDLER $ISR_Function
IMPORT $ISR_Function
EXPORT $HandlerT
$HandlerT
SUB LR, LR, #4 ; 计算返回地址.
STMFD SP!, {R0-R12, LR}
LDR R0, =OsEnterSum
LDR R1, =0x01 ; 避免中断嵌套.
STR R1, [R0]
LDR LR, =IRQ_Return+4 ; 因为 ISR 采用了 __irq 关键字.
MRS R0, SPSR
STMFD SP!, {R0} ; 保存 SPSR.
MRS R0, CPSR
MSR SPSR_cxsf, R0
LDR PC, =$ISR_Function ; IRQ 中断矢量跳转至服务程序.
MEND
;// ************************************************
IRQ_Return
LDMFD SP!, {R0}
MSR SPSR_cxsf, R0 ; 恢复 SPSR.
LDR R0, =OsEnterSum
LDR R1, =0x00
STR R1, [R0]
LDR R0, =OSTCBHighRdy ; 判断是否需要切换任务.
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
LDMEQFD SP!, {R0-R12, PC}^ ; 不进行任务切换.
LDMFD SP!, {R0-R12, LR}
LDR PC, =__OSIntCtxSw ; 进行中断级任务切换.
;// ********************************************************************************************************
HandlerIRQ HANDLER ISR_IRQ ; 非向量中断.
HandlerEINT0 HANDLER IRQ_Error
HandlerEINT1 HANDLER IRQ_Error
HandlerEINT2 HANDLER IRQ_Error
HandlerEINT3 HANDLER IRQ_Error
HandlerEINT4567 HANDLER IRQ_Error
HandlerTICK HANDLER IRQ_Error
HandlerZDMA0 HANDLER IRQ_Error
HandlerZDMA1 HANDLER IRQ_Error
HandlerBDMA0 HANDLER IRQ_Error
HandlerBDMA1 HANDLER IRQ_Error
HandlerWDT HANDLER IRQ_Error
HandlerUERR01 HANDLER IRQ_Error
HandlerTIMER0 HANDLER IRQ_Error
HandlerTIMER1 HANDLER IRQ_Error
HandlerTIMER2 HANDLER IRQ_Error
HandlerTIMER3 HANDLER IRQ_Error
HandlerTIMER4 HANDLER IRQ_Error
HandlerTIMER5 HANDLER ISR_Timer5 ; 作为系统节拍发生器使用.
HandlerURXD0 HANDLER IRQ_Error
HandlerURXD1 HANDLER IRQ_Error
HandlerIIC HANDLER IRQ_Error
HandlerSIO HANDLER IRQ_Error
HandlerUTXD0 HANDLER ISR_UTXD0 ; UART0 接收/发送中断.
HandlerUTXD1 HANDLER IRQ_Error
HandlerRTC HANDLER IRQ_Error
HandlerADC HANDLER IRQ_Error
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -