赛博客 2014-01-12 16:27 采纳率: 0%
浏览 1719

如何将自定义类的对象保存在Arduino的Flash中?

最近在编写Arduino Uno上的程序时,遇到了内存不足的问题。鉴于在Flash里头的内存空间十分充裕,而SRAM中只有2k bytes,我希望能够把自己定义类的对象数据保存在Flash里头,等到需要调用的时候再调到SRAM里头进行处理。不知哪位大神能够指导一下这需要如何操作呀?

最好额外说明一下,读与写两种情况,并给几个例子哟!谢谢啦!

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-26 18:12
    关注

    该回答引用ChatGPT

    在Arduino Uno上,程序中可以使用 PROGMEM 关键字将常量数据保存在 Flash 存储器中。如果您想要将自定义类的对象保存在 Flash 存储器中,您需要使用类似的技术。


    一种方法是使用 PROGMEM 关键字声明一个指向类对象的指针,并使用 memcpy() 函数将类对象的数据复制到 Flash 存储器中。当需要访问类对象时,可以使用 memcpy_P() 函数将数据从 Flash 存储器中复制到 SRAM 中。


    下面是一个例子,展示了如何将自定义类的对象保存在 Flash 存储器中,并从 Flash 存储器中读取和写入数据:

    #include <avr/pgmspace.h>
    
    class MyObject {
      public:
        int a;
        float b;
        char c[10];
    };
    
    // Declare a pointer to a MyObject object in PROGMEM memory
    const MyObject* objPtr PROGMEM = NULL;
    
    void setup() {
      // Allocate memory for a MyObject object in SRAM memory
      MyObject obj;
    
      // Initialize the object
      obj.a = 42;
      obj.b = 3.14;
      strncpy(obj.c, "Hello", 10);
    
      // Copy the object to PROGMEM memory
      objPtr = (const MyObject*) malloc(sizeof(MyObject));
      memcpy_P((void*)objPtr, &obj, sizeof(MyObject));
    }
    
    void loop() {
      // Read the object from PROGMEM memory
      MyObject obj;
      memcpy_P(&obj, (void*)objPtr, sizeof(MyObject));
    
      // Modify the object
      obj.a += 1;
      obj.b += 0.1;
      strncpy(obj.c, "World", 10);
    
      // Write the modified object back to PROGMEM memory
      memcpy_P((void*)objPtr, &obj, sizeof(MyObject));
    }
    

    在上面的例子中,我们声明了一个 MyObject 类型的指针 objPtr,将其存储在 PROGMEM 内存中。在 setup() 函数中,我们创建了一个 MyObject 类型的对象 obj,并初始化了它的成员变量。我们使用 malloc() 函数动态分配了一块 SRAM 内存,并使用 memcpy_P() 函数将 obj 对象的数据复制到 objPtr 指向的 PROGMEM 内存中。


    在 loop() 函数中,我们使用 memcpy_P() 函数将 objPtr 指向的 PROGMEM 内存中的数据复制到 SRAM 内存中的 obj 对象中。然后,我们修改了 obj 对象的成员变量,并使用 memcpy_P() 函数将修改后的数据写回到 objPtr 指向的 PROGMEM 内存中。


    请注意,由于 Flash 存储器的写入速度比 SRAM 存储器慢得多,因此在每次写入数据时都会有延迟。如果您需要频繁地读取和写入数据,这种延迟可能会导致性能问题。

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大