s3c44b0好像用不了向量中断模式

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

RE

兄弟&nbsp;这现象我半年前也发现过&nbsp;&nbsp;具体怎么回事也没去仔细查<br />所以自己改了44b0init.s&nbsp;&nbsp;完全取消掉向量中断的代码&nbsp;也很好用啊&nbsp;&nbsp;而且<br />44b0init.s更简化了
ccxlslr 发表于 2009-5-15 23:46 | 显示全部楼层

仔细检察!

我用向量中断并且将向量映射到RAM没问题的,<br /><br />用的44B0
 楼主| wx_scut 发表于 2009-5-27 01:19 | 显示全部楼层

谢谢楼上两位,呵呵

哦,你用的是映射阿,能发代码过来吗?我的邮箱starzhouxing@163.com,谢谢
djyos 发表于 2009-5-27 16:58 | 显示全部楼层

可以的

djyos用的就是向量模式,而且支持中断嵌套,你可以去下载源码来看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部