[ZLG-ARM] 紧急求教:LPC2136开了6个向量中断后,经常死机

[复制链接]
3313|13
 楼主| JunZe 发表于 2008-5-10 09:56 | 显示全部楼层 |阅读模式
现在有个产品马上要上,但经常死机.<br />我开了如下几个中断:<br /><br />UART0&nbsp;发送和接收中断<br />UART1&nbsp;发送和接收中断<br />TIMER0&nbsp;的捕捉脚接收一个9600的串口数据<br />TIMER1&nbsp;的定时中断提供系统时间<br /><br />我发现,不接收9600的串口数据时,系统是正常的,但一接收这个模拟串口的数据就死机了.<br /><br />周公,求教啊.
zlgarm 发表于 2008-5-10 10:47 | 显示全部楼层

你好

应该不会出现这种状况的,应该是你的软件处理时操作不当。建议如下:<br />1、中断的优先级要不重复,<br />2、中服要尽量简短。
 楼主| JunZe 发表于 2008-5-10 11:06 | 显示全部楼层

向量设置如下

&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;&=&nbsp;~VIC_BIT(VIC_TIMER1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0&nbsp;selected&nbsp;as&nbsp;IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VIC_BIT(VIC_TIMER1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0&nbsp;interrupt&nbsp;enabled<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl3&nbsp;=&nbsp;VIC_ENABLE&nbsp;|&nbsp;VIC_TIMER1;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr3&nbsp;=&nbsp;(uint32_t)timer1_isr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;address&nbsp;of&nbsp;the&nbsp;ISR<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;&=&nbsp;~VIC_BIT(VIC_TIMER0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0&nbsp;selected&nbsp;as&nbsp;IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VIC_BIT(VIC_TIMER0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0&nbsp;interrupt&nbsp;enabled<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;VIC_ENABLE&nbsp;|&nbsp;VIC_TIMER0;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(uint32_t)timer0_isr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;address&nbsp;of&nbsp;the&nbsp;ISR<br /><br /><br />&nbsp;&nbsp;VICIntSelect&nbsp;&=&nbsp;~VIC_BIT(VIC_UART0);&nbsp;&nbsp;//&nbsp;UART0&nbsp;selected&nbsp;as&nbsp;IRQ<br />&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VIC_BIT(VIC_UART0);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART0&nbsp;interrupt&nbsp;enabled<br />&nbsp;&nbsp;VICVectCntl2&nbsp;=&nbsp;VIC_ENABLE&nbsp;|&nbsp;VIC_UART0;<br />&nbsp;&nbsp;VICVectAddr2&nbsp;=&nbsp;(uint32_t)uart0ISR;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;address&nbsp;of&nbsp;the&nbsp;ISR<br /><br />&nbsp;&nbsp;VICIntSelect&nbsp;&=&nbsp;~VIC_BIT(VIC_UART1);&nbsp;&nbsp;//&nbsp;UART1&nbsp;selected&nbsp;as&nbsp;IRQ<br />&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VIC_BIT(VIC_UART1);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;UART1&nbsp;interrupt&nbsp;enabled<br />&nbsp;&nbsp;VICVectCntl1&nbsp;=&nbsp;VIC_ENABLE&nbsp;|&nbsp;VIC_UART1;<br />&nbsp;&nbsp;VICVectAddr1&nbsp;=&nbsp;(uint32_t)uart1ISR;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;address&nbsp;of&nbsp;the&nbsp;ISR
LPcfANS 发表于 2008-5-10 11:53 | 显示全部楼层

不应该...理论上所有中断开都不会死机的.

  
 楼主| JunZe 发表于 2008-5-10 12:13 | 显示全部楼层

可能死机,或者跑飞的问题在哪?

  
hotpower 发表于 2008-5-10 20:14 | 显示全部楼层

不应该~~~俺开得更多一点也无事~~~

  
lymbgd 发表于 2008-5-12 23:40 | 显示全部楼层

我也碰到了类似的问题

  
lymbgd 发表于 2008-5-12 23:44 | 显示全部楼层

我也碰到了类似的问题

&nbsp;我用了一个FIQ,三个IRQ,结果偶尔会复位.<br />三个IRQ是UART1、TIMER0、TIMER1<br />一个FIQ是外部中断<br />复位频率不确定
发表于 2008-5-13 09:14 | 显示全部楼层

是用KEIL吗?

  
 楼主| JunZe 发表于 2008-5-13 10:33 | 显示全部楼层

用WINARM Version 20070505

优化&nbsp;-Os<br />同时,用串口1接一个9600的GPS信号,在接到坐标后,进行浮点运算,以判断在200个区域的哪个区域.
zhongyb 发表于 2008-5-13 10:37 | 显示全部楼层

GCC吧?

  
zhongyb 发表于 2008-5-13 10:46 | 显示全部楼层

怀疑是编译器的问题

做产品如果用这种没有任何保障的编译器的话,即使调试运行OK,要想以后无异常运行,怕真的是要烧香了。
xxqarm 发表于 2008-5-13 13:04 | 显示全部楼层

可能是堆栈溢出,接收中断处理函数中定义了很大的接收缓冲

  
 楼主| JunZe 发表于 2008-5-30 17:41 | 显示全部楼层

前不久发现问题所在

我声明了一个数组,uint32_t&nbsp;arrary[8]&nbsp;=&nbsp;{0};<br />uint8_t&nbsp;array_cnt&nbsp;=&nbsp;0;<br /><br />程序中&nbsp;array[array_cnt++]&nbsp;=&nbsp;variable;<br />没判断array_cnt&nbsp;是否越界<br />正常情况下,array_cnt&nbsp;不会大于8.<br />某时刻,大于8,就会死机.<br /><br />我蠢那,写了这些年程序,这个地方没注意.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

60

帖子

1

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