极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21919|回复: 13

Arduino UNO R3程序空间大于14000就会出现异常,请问是内存问题还是flash问题?

[复制链接]
发表于 2013-7-5 14:00:42 | 显示全部楼层 |阅读模式
本帖最后由 dragongxq 于 2013-7-11 09:37 编辑

各位前辈,新近学习Arduino开发,用UNO R3+Sim908做一个移动定位跟踪器一样的东东。发现编译出的Binary size只要一超出14000 size左右,程序就会出现异常,表现为系统死机,在串口出现AGS打印,或一堆乱码,把代码拆分成两个项目或减少某一个部分功能,使binary小于14000就没有问题,初步怀疑是内存问题或flash空间问题,但问题是UNO R3的flash大小为32k,14k远远小于32k,折腾了几天,没有结果,请问前辈们是否遇到过类似问题,求解,多谢!
回复

使用道具 举报

发表于 2013-7-5 15:28:50 | 显示全部楼层
运行内存只有2k哦
考虑下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-5 16:31:43 | 显示全部楼层
瘦网虫 发表于 2013-7-5 15:28
运行内存只有2k哦
考虑下。

谢谢!
你的意思是我应该减少全局变量的大小吗?
对arduino的程序运行原理还不太了解,对于比较大的程序,不知arduino是如何保证在2k内存正常运行的?
我试试看把内存变量放到flash中,看能不能解决问题,再次感谢!
回复 支持 反对

使用道具 举报

发表于 2013-7-5 19:42:17 | 显示全部楼层
看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。

http://www.geek-workshop.com/thread-5159-1-1.html

希望能有帮助。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-6 01:38:26 | 显示全部楼层
瘦网虫 发表于 2013-7-5 19:42
看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。

按前辈的方法,检查了源代码,发现并没有多少固定只读的全局变量,有将近50个字节需要修改的全局变量和200字节的串口缓冲,几乎没有修改的余地,有将近200个字节的#define 字符定义,但#define定义好像不会占用RAM,应该是在编译的时候,自动嵌入代码吧?
回复 支持 反对

使用道具 举报

发表于 2013-7-8 09:17:00 | 显示全部楼层
本帖最后由 瘦网虫 于 2013-7-8 09:19 编辑
dragongxq 发表于 2013-7-6 01:38
按前辈的方法,检查了源代码,发现并没有多少固定只读的全局变量,有将近50个字节需要修改的全局变量和20 ...


你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

再给你一小段代码,我用这个代码来检查还剩多少可用内存的,呵呵。


  1. int checkSize = 1024;
  2. void checkFreeMem()
  3. {
  4.                 for(int i = checkSize;i>0;i--)
  5.                 {
  6.                         char* c = (char*)malloc(i);
  7.                         if(c)
  8.                         {
  9.                                 free(c);
  10.                                 c=NULL;
  11.                                 Serial.print("Mem left:");
  12.                                 Serial.println(i);
  13.                                 break;
  14.                         }
  15.                 }
  16. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-10 00:20:15 | 显示全部楼层
瘦网虫 发表于 2013-7-8 09:17
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

...

用2560跑,确认没有问题
回复 支持 反对

使用道具 举报

发表于 2013-7-10 08:36:34 | 显示全部楼层
dragongxq 发表于 2013-7-10 00:20
用2560跑,确认没有问题

那你想法子精简内存占用吧,或者改在2560上跑。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-11 09:37:20 | 显示全部楼层
本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现
回复 支持 反对

使用道具 举报

发表于 2013-7-15 00:17:12 | 显示全部楼层
dragongxq 发表于 2013-7-11 09:37
本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现

我也遇到这个问题。 精简库基于什么原则,不用到的函数删除?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 16:53:59 | 显示全部楼层
伯德 发表于 2013-7-15 00:17
我也遇到这个问题。 精简库基于什么原则,不用到的函数删除?

把用到的C++库用C重写,并放在ino文件中;删除不用的函数
回复 支持 反对

使用道具 举报

发表于 2013-8-1 20:43:33 | 显示全部楼层
dragongxq 发表于 2013-8-1 16:53
把用到的C++库用C重写,并放在ino文件中;删除不用的函数

好方法/。         
回复 支持 反对

使用道具 举报

发表于 2014-1-5 13:21:46 | 显示全部楼层
瘦网虫 发表于 2013-7-8 09:17
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

...

谢谢你提供的这段代码。
回复 支持 反对

使用道具 举报

发表于 2015-5-23 17:49:11 | 显示全部楼层
本帖最后由 sittinghere 于 2015-5-23 17:50 编辑
瘦网虫 发表于 2013-7-8 09:17
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

...


好办法,还可以用二分查找加快速度。

  1. int maxSize = 1024;
  2. void checkFreeMem()
  3. {
  4.         int min = 0, mid = 0;
  5.         while(min+1<maxSize){
  6.                 mid = (min+maxSize)/2;
  7.                 char* c = (char*)malloc(mid);
  8.                 if(c){
  9.                         free(c);
  10.                         min = mid;
  11.                 }
  12.                 else maxSize = mid;
  13.         }
  14.         Serial.printf("Mem left:");
  15.     Serial.printf("%d",min);
  16. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-18 10:25 , Processed in 0.052462 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表