赛博客 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 存储器慢得多,因此在每次写入数据时都会有延迟。如果您需要频繁地读取和写入数据,这种延迟可能会导致性能问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计