[ZLG-ARM] 调试问题求助,怀疑是中断问题

[复制链接]
2193|2
 楼主| active329 发表于 2007-4-11 20:16 | 显示全部楼层 |阅读模式
在调试程序过程中遇到了以下问题:<br />程序中设置了3个中断,EINT0为快速中断,Timer0和UART1为IRQ中断,程序如下:当屏蔽掉EINT0快速中断[//&nbsp;FIQEnable();]时,UART1中断正常;屏蔽掉IRQ中断[//&nbsp;IRQEnable();]时快速中断EINT0也正常;但是中断都打开时,即按照如下的程序全速运行时,程序会停止在Startup.s中的<br />;取指令中止<br />PrefetchAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrefetchAbort<br />单步运行程序到main函数的<br />&nbsp;VICIntEnable=(1&lt&lt4)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt7)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&ltEINT0);<br />处就走不下去了,按停止运行,同样停在Startup.s中的<br />;取指令中止<br />PrefetchAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrefetchAbort<br /><br />不知道是何原因,一般出现取指令中止的原因有那些呢,我个人怀疑是中断没用好,挺大家指教,谢谢!<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;/*定时器寄存器设置*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;T0PR=99;&nbsp;&nbsp;&nbsp;//设置分频系数<br />&nbsp;&nbsp;&nbsp;&nbsp;T0CCR=(0&lt&lt0)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&lt&lt1)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&lt&lt2)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt3)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置CAP0.1为上升沿捕获<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt5)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt6)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置CAP0.2为上升沿捕获<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T0CTCR=(0x03&lt&lt0)|&nbsp;&nbsp;&nbsp;//计数器在CAP的上升和下降沿递增<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0x00&lt&lt2);&nbsp;&nbsp;&nbsp;&nbsp;//选择CAP0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TC=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TCR=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动定时器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*串口寄存器设置*/<br />&nbsp;&nbsp;&nbsp;&nbsp;UART1_Init(115200,&nbsp;set);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;串口初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;U1FCR&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能FIFO,并设置触发点为8字节<br />&nbsp;&nbsp;&nbsp;&nbsp;U1IER&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />PINSEL0=(PINSEL0&0xFFFFFFC3)|(0x02&lt&lt4)|(0x03&lt&lt2);//P0.2接捕获0.0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P0.1为EINT0&nbsp;<br />PINSEL1=(PINSEL1&0xFC3FFCFF)|(0x0A&lt&lt22);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE=0x01;&nbsp;&nbsp;&nbsp;//设置EINT0为边沿激活<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTPOLAR=0x01;&nbsp;&nbsp;//上升沿有效<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FIQEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*设置Timer0EINT1中断*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect=0x00004000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置除EINT0外的通道为IRQ中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0=0x20|0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Timer0分配到IRQslot0<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0=(uint32)IRQ_Timer0;&nbsp;//设置Timer0向量地址<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl1&nbsp;=&nbsp;0x20&nbsp;|&nbsp;0x07;//&nbsp;UART1分配到IRQ&nbsp;slot1<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr1&nbsp;=&nbsp;(uint32)IRQ_UART1;//&nbsp;设置UART1向量地址<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T0IR=0x01;&nbsp;//使能Timer0中断<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清除EINT0中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable=(1&lt&lt4)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&lt7)|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&lt&ltEINT0);<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rcv_new&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_new&nbsp;=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_SendBuf();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0):<br />}
zlgARM 发表于 2007-4-11 22:17 | 显示全部楼层

active329

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;取指中止发生时,查看一下此时的PC。确定是在何处发生取指中止。
 楼主| active329 发表于 2007-4-12 10:18 | 显示全部楼层

继续

查过了,取指中止发生时的PC为0x400000A0,应该在片内RAM中,不知道什么原因,如何解决,请指教,谢谢<br /><br />还有,我的程序设定了一个快速中断(EINT0),两个IRQ中断(Timer0和UART1。知道快速中断和Timer0中断不会同时发生,Timer0和UART1中断可能同时发生,要求Timer0中断发生时必须执行Timer0中断程序,完成一定数量的AD采集,要不就会错过采集时间(就是要在Timer0中断中完成AD采集,必须完成),所以将Timer0分配为Slot0,UART1分配为Slot1;快速中断(EINT0)和UART1可能同时发生。所以就将3者设定成一个快速中断(EINT0),两个IRQ中断(Timer0和UART1。不知道这样合理么,还有一个程序中设定3个中断,会乱么,会有问题么?<br />大家谈谈看法,谢谢了,我还是初学者,好多不懂,请大家多多指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

14

帖子

0

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