dragongxq 发表于 2013-7-5 14:00:42

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,折腾了几天,没有结果,请问前辈们是否遇到过类似问题,求解,多谢!

瘦网虫 发表于 2013-7-5 15:28:50

运行内存只有2k哦
考虑下。

dragongxq 发表于 2013-7-5 16:31:43

瘦网虫 发表于 2013-7-5 15:28 static/image/common/back.gif
运行内存只有2k哦
考虑下。

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

瘦网虫 发表于 2013-7-5 19:42:17

看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。

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

希望能有帮助。

dragongxq 发表于 2013-7-6 01:38:26

瘦网虫 发表于 2013-7-5 19:42 static/image/common/back.gif
看看我的帖子,我以前也遇到你类似的问题。
ram内存不够。



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

瘦网虫 发表于 2013-7-8 09:17:00

本帖最后由 瘦网虫 于 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;
                        }
                }
}

dragongxq 发表于 2013-7-10 00:20:15

瘦网虫 发表于 2013-7-8 09:17 static/image/common/back.gif
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

...

用2560跑,确认没有问题

瘦网虫 发表于 2013-7-10 08:36:34

dragongxq 发表于 2013-7-10 00:20 static/image/common/back.gif
用2560跑,确认没有问题

那你想法子精简内存占用吧,或者改在2560上跑。

dragongxq 发表于 2013-7-11 09:37:20

本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现

伯德 发表于 2013-7-15 00:17:12

dragongxq 发表于 2013-7-11 09:37 static/image/common/back.gif
本问题已解决。把用到的sim908 gsm/gprs library代码从C++转换为C,并做了一些精简,此问题不再复现

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

dragongxq 发表于 2013-8-1 16:53:59

伯德 发表于 2013-7-15 00:17 static/image/common/back.gif
我也遇到这个问题。 精简库基于什么原则,不用到的函数删除?

把用到的C++库用C重写,并放在ino文件中;删除不用的函数

伯德 发表于 2013-8-1 20:43:33

dragongxq 发表于 2013-8-1 16:53 static/image/common/back.gif
把用到的C++库用C重写,并放在ino文件中;删除不用的函数

好方法/。         

loneress 发表于 2014-1-5 13:21:46

瘦网虫 发表于 2013-7-8 09:17 static/image/common/back.gif
你可以先用arduino mega 2560跑同样的代码,如果能正常运行就可以确定是flash或者ram占用的问题了。

...

谢谢你提供的这段代码。

sittinghere 发表于 2015-5-23 17:49:11

本帖最后由 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]
查看完整版本: Arduino UNO R3程序空间大于14000就会出现异常,请问是内存问题还是flash问题?