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