我想使用s3c44b0的向量中断,修改了启动代码44b0init.s: AREA Init,CODE,READONLY
ENTRY b ResetHandler ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved subs pc,lr,#4 b HandlerFIQ HandlerADC VHANDLER HandleADC HandlerRTC VHANDLER HandleRTC HandlerUTXD1 VHANDLER HandleUTXD1 HandlerUTXD0 VHANDLER HandleUTXD0 HandlerSIO VHANDLER HandleSIO HandlerIIC VHANDLER HandleIIC HandlerURXD1 VHANDLER HandleURXD1 HandlerURXD0 VHANDLER HandleURXD0 HandlerTIMER5 VHANDLER HandleTIMER5 HandlerTIMER4 VHANDLER HandleTIMER4 HandlerTIMER3 VHANDLER HandleTIMER3 HandlerTIMER2 VHANDLER HandleTIMER2 HandlerTIMER1 VHANDLER HandleTIMER1 HandlerTIMER0 VHANDLER HandleTIMER0 HandlerUERR01 VHANDLER HandleUERR01 HandlerWDT VHANDLER HandleWDT HandlerBDMA1 VHANDLER HandleBDMA1 HandlerBDMA0 VHANDLER HandleBDMA0 HandlerZDMA1 VHANDLER HandleZDMA1 HandlerZDMA0 VHANDLER HandleZDMA0 HandlerTICK VHANDLER HandleTICK HandlerEINT4567 VHANDLER HandleEINT4567 HandlerEINT3 VHANDLER HandleEINT3 HandlerEINT2 VHANDLER HandleEINT2 HandlerEINT1 VHANDLER HandleEINT1 HandlerEINT0 VHANDLER HandleEINT0
HandlerDef stmfd sp!,{r0,r1} ;//r0,r1入栈 ldr r0,=I_PMST ;//把中断主从优先级分配器地址放入r0 ldr r1,[r0] ;//把其里面的内容放入r1 str r1,[r0] ;//把寄存器r1的内容放入中断主从优先级分配器地址 ldmfd sp!,{r0,r1} ;//原r0,r1工作寄存器内容出栈 subs pc,lr,#4 ;//跳回到原执行地址
去掉了非向量中断的部分 重新使用了向量中断处理宏定义: ;/************************************** 向量中断跳转宏定义 ************************************************/
MACRO $VHandlerLabel VHANDLER $VHandleLabel
$VHandlerLabel sub sp,sp,#4 ;//sp 减4是为了存储跳转地址用 stmfd sp!,{r0} ;//工作寄存器入栈r0(LR不入栈,因为它返回到原始地址) ldr r0,=I_ISPR ;//把中断挂起寄存器地址放入r0 ldr r0,[r0] ;//把中断挂起寄存器内容放入r0 cmp r0,#0x0 ;//比较,看是否有中断产生 beq %F0 ;//若无中断产生,跳到标号0处 ldr r0,=$VHandleLabel ;//加载 VHandleXXX的地址到 r0寄存器 ldr r0,[r0] ;//加载VHandleXXX的内容(即服务子程序的起始地址)到r0寄存器 str r0,[sp,#4] ;//r0寄存器内容入栈 ldmfd sp!,{r0,pc} ;//原r0工作寄存器内容和跳转到ISR的地址出栈 0 stmfd sp!,{r1} ;//工作寄存器r1入栈(LR不入栈,因为它返回到原始地址) ldr r0,=I_PMST ;//把中断主从优先级分配器地址放入r0 ldr r1,[r0] ;//把其里面的内容放入r1 str r1,[r0] ;//把寄存器r1的内容放入中断主从优先级分配器地址 ldmfd sp!,{r0,r1} ;//原r0,r1工作寄存器内容出栈//是否r0r1应该交换? add sp,sp,#4 ;//指针堆栈加4 subs pc,lr,#4 MEND 填充了中断向量表空缺的内容(以下是一部分): VECTOR_BRANCH ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table ldr pc,=HandlerEINT1 ; ldr pc,=HandlerEINT2 ; ldr pc,=HandlerEINT3 ; ldr pc,=HandlerEINT4567 ; ldr pc,=HandlerTICK ;mGA ldr pc,=HandlerDef ;这是我填充的 ldr pc,=HandlerDef ...... 主程序中改成了向量中断模式: rINTCON = 0x1; // 所有中断均使用向量中断,打开 IRQ ,禁止 FIQ rINTMOD = 0x00; // 所有模式配置为 IRQ 模式 rINTMSK = 0x07ffffff; // 屏蔽所有中断 但是我用ADS中的AXD调试时,程序一发生中断(按下了按键)就进入为定义异常,在u-boot里面运行go 0xc008000后,按下键就重新启动,请各位高手帮我看看是什么问题?
|