Arduino UNO R3程序空间大于14000就会出现异常,请问是内存问题还是flash问题?
本帖最后由 dragongxq 于 2013-7-11 09:37 编辑各位前辈,新近学习Arduino开发,用UNO R3+Sim908做一个移动定位跟踪器一样的东东。发现编译出的Binary size只要一超出14000 size左右,程序就会出现异常,表现为系统死机,在串口出现AGS打印,或一堆乱码,把代码拆分成两个项目或减少某一个部分功能,使binary小于14000就没有问题,初步怀疑是内存问题或flash空间问题,但问题是UNO R3的flash大小为32k,14k远远小于32k,折腾了几天,没有结果,请问前辈们是否遇到过类似问题,求解,多谢! 运行内存只有2k哦
考虑下。 瘦网虫 发表于 2013-7-5 15:28 static/image/common/back.gif
运行内存只有2k哦
考虑下。
谢谢!
你的意思是我应该减少全局变量的大小吗?
对arduino的程序运行原理还不太了解,对于比较大的程序,不知arduino是如何保证在2k内存正常运行的?
我试试看把内存变量放到flash中,看能不能解决问题,再次感谢! 看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。
http://www.geek-workshop.com/thread-5159-1-1.html
希望能有帮助。 瘦网虫 发表于 2013-7-5 19:42 static/image/common/back.gif
看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。
按前辈的方法,检查了源代码,发现并没有多少固定只读的全局变量,有将近50个字节需要修改的全局变量和200字节的串口缓冲,几乎没有修改的余地,有将近200个字节的#define 字符定义,但#define定义好像不会占用RAM,应该是在编译的时候,自动嵌入代码吧? 本帖最后由 瘦网虫 于 2013-7-8 09:19 编辑
dragongxq 发表于 2013-7-6 01:38 static/image/common/back.gif
按前辈的方法,检查了源代码,发现并没有多少固定只读的全局变量,有将近50个字节需要修改的全局变量和20 ...
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。
再给你一小段代码,我用这个代码来检查还剩多少可用内存的,呵呵。
int checkSize = 1024;
void checkFreeMem()
{
for(int i = checkSize;i>0;i--)
{
char* c = (char*)malloc(i);
if(c)
{
free(c);
c=NULL;
Serial.print("Mem left:");
Serial.println(i);
break;
}
}
} 瘦网虫 发表于 2013-7-8 09:17 static/image/common/back.gif
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。
...
用2560跑,确认没有问题 dragongxq 发表于 2013-7-10 00:20 static/image/common/back.gif
用2560跑,确认没有问题
那你想法子精简内存占用吧,或者改在2560上跑。 本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现 dragongxq 发表于 2013-7-11 09:37 static/image/common/back.gif
本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现
我也遇到这个问题。 精简库基于什么原则,不用到的函数删除? 伯德 发表于 2013-7-15 00:17 static/image/common/back.gif
我也遇到这个问题。 精简库基于什么原则,不用到的函数删除?
把用到的C++库用C重写,并放在ino文件中;删除不用的函数 dragongxq 发表于 2013-8-1 16:53 static/image/common/back.gif
把用到的C++库用C重写,并放在ino文件中;删除不用的函数
好方法/。 瘦网虫 发表于 2013-7-8 09:17 static/image/common/back.gif
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。
...
谢谢你提供的这段代码。 本帖最后由 sittinghere 于 2015-5-23 17:50 编辑
瘦网虫 发表于 2013-7-8 09:17 static/image/common/back.gif
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。
...
好办法,还可以用二分查找加快速度。
int maxSize = 1024;
void checkFreeMem()
{
int min = 0, mid = 0;
while(min+1<maxSize){
mid = (min+maxSize)/2;
char* c = (char*)malloc(mid);
if(c){
free(c);
min = mid;
}
else maxSize = mid;
}
Serial.printf("Mem left:");
Serial.printf("%d",min);
}
页:
[1]