为何会在MDK的printf中跑飞

[复制链接]
5498|10
 楼主| ilcvm 发表于 2009-12-24 10:11 | 显示全部楼层 |阅读模式
近段时间在用ARM7 STR751碰上很莫名其妙的问题,搞了几天也查不出问题所在,望众高手指点指点

那段程序本来运行正常的,后来为配合新加入独立于这程序BOOTLOADER,起始地址后移32K(0x20000000->0x20008000),中断表拷到内存起始区然后在REMAP到RAM。程序启动正常,中断进入正常,但程序跑着跑着就飞。而且飞得很没规律,一直无法跟踪到出错语句。后来发现一旦把所有printf都取消掉,程序就不再飞了。最让我费解的是起始位置还原到0x20000000问题就消失,尽管依然REMAP到RAM。

为进一步确定问题所在,我想尽量让错误稳定出现,就把中断都关掉,只保留一处用printf的地方直接写UART发送寄存器发个字符出来,但依然飞得很没规律。一般是在某句printf开始的时候飞的(printf前的字符已收到),很偶尔的情况在中间飞(字符串只发到一半)。而更好笑的是仿真时如果我在库代码里printf函数的入口加个断点,就基本没飞过了,断点一DISABLE就没printf几次就飞了。

为了试出最简出错环境,我在进入主循环前加了死循环,就是不停地printf一些字符串和变量,但无论是否关中断就他妈的不飞。

这些情况搞得我好郁闷,如果是MDK的RVCT自带的C库有BUG,那每次跑飞的位置应该一样才对啊,IRQ都被我关掉了,而且为了环境尽可能一致我在启动代码加了段把所有RAM都清零的语句。最想不通就是程序放到0x20000000就啥问题都没有。

后来把初始化程序改了一下,加入REMAP代码并把向量表都拷到RAM区。也就是程序在进入C库初始化前已经完成REMAP的所有工作。但问题依旧。

这时把*.o (RESET, +First)(包括向量表和各个中断响应初始化程序)加载到0x20000000,其余代码加载到0x20008000,也就是说初始化代码,所有C库代码和其他代码都在这区里面。测试问题消失。

两次实验区别应该只有如下几点:
1. 前者运行前执行了32K的0x0代码。
2. 前者中断响应初始化程序(75x_vect.s里的代码)在0x20008000区内运行。
3. 前者在0x20008000区的代码加载位置整体后移了约1.5K。

大家认为问题有最可能出在哪呢?谢谢。
xinzha 发表于 2009-12-24 10:49 | 显示全部楼层
最好能把你的scatter文件和init.s(或者是startup.s)发出来看看
 楼主| ilcvm 发表于 2009-12-24 11:43 | 显示全部楼层
好的,附近里面是目前我用的启动文件和分散加载脚本文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xinzha 发表于 2009-12-24 15:11 | 显示全部楼层
根据LZ的描述,个人感觉像是Heap或者Stack出了问题,stack的可能性更大。
你在硬件不改的基础上只是将入口后移,这无形中就相当于你的ram少了32K,可能stack的空间被挤没了。
当你用while(1)来测试printf的时候,while(1)后面的代码可能已经不被编译连接(如果你打开了编译优化),所以空间问题消失。
没有用过STR751,等晚上找到资料再跟LZ学习。
 楼主| ilcvm 发表于 2009-12-24 16:51 | 显示全部楼层
RAM没有少那么多,只少了192个字节用来放中断向量而已。后移的是FLASH地址,也就是FLASH少了32K。
我开始也觉得是STACK问题,但我试过把STACK的大小增加一倍到2k也没有效果。而且我觉得我关了中断后,就基本没有外部输入量(信号检测接收都在中断完成),但跑飞位置依然是随机的。
liuwei0908 发表于 2009-12-27 00:12 | 显示全部楼层
printf会占用大量的stack,
flyingpig4945 发表于 2012-4-7 00:18 | 显示全部楼层
楼主搞定了没有?
wandersky 发表于 2013-11-29 08:37 | 显示全部楼层
我也遇到这样的问题了
wandersky 发表于 2013-11-29 08:38 | 显示全部楼层
我是在LPC2294上遇到的
天命风流 发表于 2013-11-29 08:43 | 显示全部楼层
路过!!!                    
zchong 发表于 2013-11-29 11:44 | 显示全部楼层
选择microlib
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

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