近段时间在用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。
大家认为问题有最可能出在哪呢?谢谢。 |