代码之家  ›  专栏  ›  技术社区  ›  Gordon Williams

Arduino atmega2560代码大小

  •  2
  • Gordon Williams  · 技术社区  · 10 年前

    我一直在尝试在ATMEGA2560上运行一些代码,最终我将所有内容归结为:

    作品

    #include "Arduino.h"
    #include "HardwareSerial.h"
    
    const char bob[7000] = "Hello\0";
    
    
    void setup(void) {
      Serial.begin(9600);
      Serial.println("jshInit...");
      Serial.println(bob);
    }
    
    void loop(void) {
      Serial.println("foo...");
    }
    

    什么都不做

    #include "Arduino.h"
    #include "HardwareSerial.h"
    
    const char bob[8000] = "Hello\0";
    
    
    void setup(void) {
      Serial.begin(9600);
      Serial.println("jshInit...");
      Serial.println(bob);
    }
    
    void loop(void) {
      Serial.println("foo...");
    }
    

    这里唯一的区别是 bob 。有 没有编译器警告或任何内容,即使 上下快速移动 是20000 ,Arduino只是拒绝工作,如果 上下快速移动 数组太大。

    有人知道怎么了吗?我在这里使用Arduino IDE进行编译,但对于我的主要项目,我使用的是avr-gcc(gcc)4.5.3,我也尝试了4.8.2——所有这些都存在相同的问题。

    atmega2560具有256kb闪存和8kB RAM。可能是我正在使用所有的RAM(但它应该告诉我是不是这样?),还有 const 关键字打开 上下快速移动 这应该意味着它进入闪光?

    1 回复  |  直到 10 年前
        1
  •  3
  •   Rev    10 年前

    是的,你确实用完了SRAM。

    关于您的评论:您不能使用 const 关键字实现与使用PROGMEM属性相同的功能。

    const用于告诉编译器数据是“只读”的。const旨在用于此类用途,而不是作为标识数据应存储在何处的方法。如果它被用作定义数据存储的手段,那么在其他情况下,例如在函数参数示例中,它将失去正确的含义(改变其语义)。

    但是,如果您有大量的常量字符串/数据,那么确实应该使用 PROGMEM 以指示编译器将数据移动到闪存中。

    如果您的数据集需要读/写访问,并且必须是非易失性的,您可以使用EEPROM。

    有一些工具,如 avr-size.exe (GCC工具链的一部分)在编译时检查静态SRAM的使用情况。 请记住,您还必须确保在程序执行期间动态SRAM需求(STACK)不会超过剩余内存。

    还可以通过查看堆栈指针来确定运行时SRAM的使用情况。如果只关注SRAM的最大使用量,也可以将虚拟模式写入SRAM(例如,所有0xAA),并检查模式被覆盖的地址。