|
本人正在将IAR的S64代码移到MDK中,目前遇到的中断无法进入的问题,于是发现IAR或ADS的中断(IRQ)均有一段汇编代码,在这代码中调用了IVR内的地址,这段汇编代码均类似下面的代码:
SUB LR, LR, #4 ; Calculate the returning address 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; Protects the task environments 保存任务环境
MRS R3, SPSR ; Protects the status variable 保存状态
STMFD SP, {R3,LR}^ ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写
; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
NOP
SUB SP, SP, #4*2
MSR CPSR_c, #(NoInt | SYS32Mode) ; Switch to the System Mode 切换到系统模式
BL $IRQ_Exception_Function ; call the C interrupt handler funtion 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; Switch bak to IRQ mode 切换回irq模式
LDMFD SP, {R3,LR}^ ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写
; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
MSR SPSR_cxsf, R3
ADD SP, SP, #4*2 ;
LDMFD SP!, {R0-R3, R12, PC}^ ;
而在RealView MDK中在中断向量中直接调用AIC_IVR内地址
Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP ; Reserved Vector
; LDR PC,IRQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_IVR
; LDR PC,FIQ_Addr
LDR PC,[PC,#-0xF20] ; Vector From AIC_FVR
我现在请教的是,MDK中是否不需要那段汇编的代码,中断处理程序中附加的__irq关键字是否能完成相同的功能? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|