打印
[ZLG-ARM]

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

[复制链接]
2038|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JunZe|  楼主 | 2008-5-10 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在有个产品马上要上,但经常死机.
我开了如下几个中断:

UART0 发送和接收中断
UART1 发送和接收中断
TIMER0 的捕捉脚接收一个9600的串口数据
TIMER1 的定时中断提供系统时间

我发现,不接收9600的串口数据时,系统是正常的,但一接收这个模拟串口的数据就死机了.

周公,求教啊.

相关帖子

沙发
zlgarm| | 2008-5-10 10:47 | 只看该作者

你好

应该不会出现这种状况的,应该是你的软件处理时操作不当。建议如下:
1、中断的优先级要不重复,
2、中服要尽量简短。

使用特权

评论回复
板凳
JunZe|  楼主 | 2008-5-10 11:06 | 只看该作者

向量设置如下

    VICIntSelect &= ~VIC_BIT(VIC_TIMER1);          // UART0 selected as IRQ
    VICIntEnable = VIC_BIT(VIC_TIMER1);            // UART0 interrupt enabled
    VICVectCntl3 = VIC_ENABLE | VIC_TIMER1;
    VICVectAddr3 = (uint32_t)timer1_isr;            // address of the ISR

    VICIntSelect &= ~VIC_BIT(VIC_TIMER0);          // UART0 selected as IRQ
    VICIntEnable = VIC_BIT(VIC_TIMER0);            // UART0 interrupt enabled
    VICVectCntl0 = VIC_ENABLE | VIC_TIMER0;
    VICVectAddr0 = (uint32_t)timer0_isr;            // address of the ISR


  VICIntSelect &= ~VIC_BIT(VIC_UART0);  // UART0 selected as IRQ
  VICIntEnable = VIC_BIT(VIC_UART0);    // UART0 interrupt enabled
  VICVectCntl2 = VIC_ENABLE | VIC_UART0;
  VICVectAddr2 = (uint32_t)uart0ISR;    // address of the ISR

  VICIntSelect &= ~VIC_BIT(VIC_UART1);  // UART1 selected as IRQ
  VICIntEnable = VIC_BIT(VIC_UART1);    // UART1 interrupt enabled
  VICVectCntl1 = VIC_ENABLE | VIC_UART1;
  VICVectAddr1 = (uint32_t)uart1ISR;    // address of the ISR

使用特权

评论回复
地板
LPcfANS| | 2008-5-10 11:53 | 只看该作者

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

使用特权

评论回复
5
JunZe|  楼主 | 2008-5-10 12:13 | 只看该作者

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

使用特权

评论回复
6
hotpower| | 2008-5-10 20:14 | 只看该作者

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

使用特权

评论回复
7
lymbgd| | 2008-5-12 23:40 | 只看该作者

我也碰到了类似的问题

使用特权

评论回复
8
lymbgd| | 2008-5-12 23:44 | 只看该作者

我也碰到了类似的问题

 我用了一个FIQ,三个IRQ,结果偶尔会复位.
三个IRQ是UART1、TIMER0、TIMER1
一个FIQ是外部中断
复位频率不确定

使用特权

评论回复
9
| | 2008-5-13 09:14 | 只看该作者

是用KEIL吗?

使用特权

评论回复
10
JunZe|  楼主 | 2008-5-13 10:33 | 只看该作者

用WINARM Version 20070505

优化 -Os
同时,用串口1接一个9600的GPS信号,在接到坐标后,进行浮点运算,以判断在200个区域的哪个区域.

使用特权

评论回复
11
zhongyb| | 2008-5-13 10:37 | 只看该作者

GCC吧?

使用特权

评论回复
12
zhongyb| | 2008-5-13 10:46 | 只看该作者

怀疑是编译器的问题

做产品如果用这种没有任何保障的编译器的话,即使调试运行OK,要想以后无异常运行,怕真的是要烧香了。

使用特权

评论回复
13
xxqarm| | 2008-5-13 13:04 | 只看该作者

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

使用特权

评论回复
14
JunZe|  楼主 | 2008-5-30 17:41 | 只看该作者

前不久发现问题所在

我声明了一个数组,uint32_t arrary[8] = {0};
uint8_t array_cnt = 0;

程序中 array[array_cnt++] = variable;
没判断array_cnt 是否越界
正常情况下,array_cnt 不会大于8.
某时刻,大于8,就会死机.

我蠢那,写了这些年程序,这个地方没注意.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

60

帖子

1

粉丝