打印
[ZLG-ARM]

程序运行十来分钟会不定时的进入取数据终止或是取指令终

[复制链接]
2348|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
syzhou1314|  楼主 | 2008-1-29 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠好~!
    最近开发用的LPC2132,程序也不是很大,烧到flash中运行,大概差不多十几分钟或更长会死机,而后用debug调试发现程序运行一段时间后会进入取数据或是取指令终止,网上说是程序中的数组越界或指针跑飞了,我检查代码也没发现有什么不妥。并不是一次都不能执行,而是执行了一段时间后进入取数据终止或取数据终止,我把LPC2132换成更大ram空间的LPC2148也是一样!
    原因很难找,有哪位知道或是碰到这种情况?怎么解决或怎么查找原因啊?谢谢

相关帖子

沙发
zlgarm| | 2008-1-29 11:43 | 只看该作者

回复如下:

syzhou1314,您好!
    对于您的问题作如下回答:
    1、发生中止异常大多数是由于程序的问题,常见的原因是指针操作不当引起的,所以建议您仔细查找您程序指针操作是否正确。由于LPC2000系列ARM是ARM7DIMI内核,不具有MMU,所以不应该发生中止异常。
    2、您可以通过中止模式下的R14找到进入异常前的程序位置。

                                               By  zlgarm_wzj

使用特权

评论回复
板凳
syzhou1314|  楼主 | 2008-1-29 13:02 | 只看该作者

谢谢您的回复,我现在是这样做的

 将startup.s中的以下代码
"    
;取指令中止
PrefetchAbort
        B       PrefetchAbort

;取数据中止
DataAbort
        B       DataAbort
"

改成:

"
      
;取指令中止
PrefetchAbort
        B       PrefetchAbort

;取数据中止
DataAbort
        mov     PC,LR
        B       DataAbort
"
然后在"mov     PC,LR"处设一断点,等程序执行到这里的时候,单步执行程序就会跳到LR所指向的代码地址,该地址就是发生取数据异常的地方?,这样做对吧,我正在测!

使用特权

评论回复
地板
syzhou1314|  楼主 | 2008-1-29 13:15 | 只看该作者

程序已经死掉了

程序已经死掉了,但是程序并没有停在已经设置了断点的"mov     PC,LR"语句处,当我点了axd中的stop按钮后,程序停在"B       DataAbort"处,为什么没有停在我的断点处呢?此时的abort模式中的LR值为"0x833b9980",但是我从哪里能查到该地址对应的代码呢?请指教!谢谢

使用特权

评论回复
5
syzhou1314|  楼主 | 2008-1-29 13:34 | 只看该作者

程序指针

我又仔细检查了遍,程序中只有在定义函数形参的时候有很多指针,其他地方没有用指针,而是数组,其中我在传递实参的时候用的是数组名加1或是加2操作,
比如:
定义函数
void function(uint8 *p)
{
..
}
调用的时候function(a+1),其中a是一个全局或局部的一维数组名!
这样有什么不妥吗您说?

使用特权

评论回复
6
zlgarm| | 2008-1-29 13:55 | 只看该作者

回复如下:

syzhou1314,您好!
    您定义的指针有没有赋初值;不要通过一个没有赋初值的指针来读写数据。

                                              By  zlgarm_wzj

使用特权

评论回复
7
syzhou1314|  楼主 | 2008-1-29 14:16 | 只看该作者

您说我的形参指针没有赋初值??

定义函数
void function(uint8 *p)
您说我这个形参指针怎样赋初值?难道要这样啊
void function(uint8 *p=0)这样编译也通不过啊?

使用特权

评论回复
8
dld2| | 2008-1-29 14:26 | 只看该作者

仔细看看程序吧

通常是野指针或者数组越界。

使用特权

评论回复
9
armecos| | 2008-1-29 14:27 | 只看该作者

《ecos增值包》里对此有解决方案,

针对2210,但应该对2132也有效。经过处理后,程序在flash里运行很稳定。

www.armecos.com

使用特权

评论回复
10
zlgarm| | 2008-1-29 14:48 | 只看该作者

回复如下

syzhou1314,您好!
    出现这样的问题通常是您在程序里通过一个没有赋初值的指针(也就是野指针)来读写数据或者您的数组越界造成的,所以建议您仔细检查您的代码,重点检查指针和数组方面的代码。

                                                         By  zlgarm_wzj

使用特权

评论回复
11
syzhou1314|  楼主 | 2008-1-29 16:11 | 只看该作者

多谢版主以上两位的的回复

我会仔细再检查仔细研究一下的,感觉应该是程序问题~!
解决了我会把原因贴出来的~!我刚开始工作,可能是经验不足的原因~!呵呵

使用特权

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

本版积分规则

19

主题

61

帖子

2

粉丝