最近在使用MDK开发LPC1768的一个项目。利用的是MDK自动生成的启动代码,稍作修改后使用,在调试程序的时候,发现了大量的问题:
1. 程序中开有一个全局的数组,300字节,在VS2010上调试程序完全正确,但是移植到MDK上却是数据错误的,打印出来的结果和预想的不相同
2.更奇异的的是当我多写一个函数,函数中定义有变量,那么再运行程序时候,打印300个字节的数据缓冲区内容,发现我没有写这个新函数时结果又不一样。
3.调试N久,痛苦N天,修改程序中函数,把尽可能省的变量,数组都去了,嗯,不错,结果终于正确,窃喜中,这断定这应该是内存问题,但是想想不应该是内存溢出,因为LPC1768有64K RAM,完全够用,一时也想不清楚怎么回事,就先放下了,反正目前正确了。
4.上一步减少无用变量方法只能解决眼前问题,确定,随着代码的增加,变量增加,今天,那个顶怪的现在再次重现,我已经没有办法去除变量来修正这一问题了。痛若中……
5.继续痛苦……
6.生活总是要继续……,思考!
7.突发奇想:能不能把这个重要的全局数组直接指定到某一个地址上,这样会不会就不会造成这个问题了呢?
8.心动不如行动,说干就干!!!!!!!
9.查询MDK的帮助文档,也利益于当年自己那什么杂7杂8的书都看过的好处,找到了定位方法:
#include <absacc.h>
unsigned char data_packge_buffer[300] __at ( 0x10000000 + 0x8000 - 0x4ff) = {0}; int x __at (0x10000004 ); // variable at address 0x10000004试了,果然可以这么用,编译,没错!
测试:结果还是不行!……继续探索……,最后找到说明了:定位也是仅仅定起始位置,但是并不会检测这个位置是是其他变量使用了,也没有开辟相应的内存空间,所以此路不通。
10.思索继续进行……
11.能不能使用动态分配?????
12.动态分配空间不会自动释放,应该能解决,但是,没有上操作系统,不好弄动态分配空间,无语中……
13.绝境逢生,经过查阅大量资料,最后终于找出了问题的根源---------代码中的栈空间太小,导致多定义局部变量时候会影响到全局变量,简单说地址重合了!!!!!!
14.蛋疼,这KEIL MDK也不太靠普。竟然检测不到栈空间不足的严重问题。
15.问题找到了,兴奋中,感谢党,感谢CCTV,感谢MTV!
16.对了,忘记说最重要的了,当然是解决方法:很简单,修改代码的栈空间大小。
此文章为本人原创,也是本人付出不少汗水写出来的,转载请注明出处!