算了,这个错误我还没搞懂,不过,我自己写了个通俗点的IRQ.S的实现
经测试,跟陈工的功能一样,可以实现IRQ之间的嵌套以及在IRQ中嵌套FIQ
我把我写的帖出来分享一下:
前面是一样的,从$IRQ_Label后面的实现不一样
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
CODE32
AREA MYIRQ,CODE,READONLY
MACRO
$IRQ_Label MYHANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; The label for exports 输出的标号
IMPORT $IRQ_Exception_Function ; The imported labels 引用的外部标号
$IRQ_Label
STMFD SP!, {R0-R3,R12,LR}
MRS R0, SPSR
STMFD SP!, {R0}
MSR CPSR_c,#(NoInt|SYS32Mode) ;这里一定要加NoInt,在还没有真正进人c函数的中断服务程序之前,IRQ中断标志没有清除
;这时强制开通IRQ相应将导致不可预料的结果,往往是预取中止。
STMFD SP!,{R0-R3,R12,LR} ;保存系统模式下的寄存器
BL $IRQ_Exception_Function ;在系统模式下跳到C函数中断服务程序
LDMFD SP!, {R0-R3,R12,LR} ;在系统模式下恢复系统模式下的寄存器
MSR CPSR_c,#(NoInt|IRQ32Mode) ;转入IRQ模式
LDMFD SP!,{R0} ;弹出SPSR_irq到R0
MSR SPSR_cxsf,R0 ;恢复SPSR_irq
LDMFD SP!,{R0-R3,R12,LR} ;弹出进人IRQ时保存的寄存器,特别是保存了从IRQ返回的地址的寄存器LR
SUBS PC,LR,#4 ;LR-4得出中断前下一条要执行的指令。这是由ARM核对中断相应的规则决定的。
MEND
/***********定义自己的宏实例****************/
;MYEINT_Handler MYHANDLER irq_EINT0
END
|