arduino 闪存阵列

Posted

技术标签:

【中文标题】arduino 闪存阵列【英文标题】:arduino flash memory array 【发布时间】:2016-09-25 10:04:39 【问题描述】:

我有许多不同大小的数组存储在闪存中。 我可以使用

访问单个数组条目
byte j = pgm_read_byte(&(array[x]));

我想要做的是将闪存中的数组作为参数传递给函数。我尝试将指向数组的指针作为参数提供,但这会产生编译错误:

void callPGM2(byte arr_size, byte *arr) 
..
..


ptr2 = &pgm_read_byte(&(array_1[0]));
callPGM2(5, &ptr2);

可以将完整的数组作为函数参数从闪存传递吗?

【问题讨论】:

无论pgm_read_byte 函数返回什么,它都不能用作指针。如果它返回一个int(如第一个代码sn-p所示),那么为什么要将它作为字节数组传递给callPGM2函数? 此外,在 C(以及 C++)中,数组自然衰减指向指向它们的第一个元素的指针。如果需要byte *,并且您有一个byte 数组,那么按原样传递数组将与例如传递数组一样好。 &array[0]. pgm_read_byte 是 avr/pgmspace 库中的一个函数。上面的代码 sn-p 我犯了一个错误,我认为它返回字节。 将数组传递给函数的原因是函数可以执行操作并将数组中定义的值通过i2c写入辅助设备 我认为您可以使用pointer to PROGMEM 作为函数参数,但不要将其与非 PROGMEM 指针混合使用。你介意在真实硬件中测试this,因为我现在没有它。如果这不是你的意思,请忽略我的评论。 【参考方案1】:

没有办法直接传递指向 PROGMEM 变量的指针,因为 AVR 的哈佛架构有 2 个 C 无法直接表达的地址空间 - 例如,您需要使用 memcpy_P 将内存临时复制到 RAM .

并且您想了解 pgmspace 库中提供的功能。它拥有许多 C 函数(如 strcmp)的等价物,允许您在程序空间中使用常量参数。

【讨论】:

谢谢,我确实遇到过另一篇提到哈佛架构的帖子,但没有人确认指向闪存的指针是否可以用作函数中的参数。 我对这个解释有点困惑。像memcpy_P 这样的函数不是将指向 PROGMEM 的指针作为其参数之一吗?所以从技术上讲,我们可以定义类似的函数来接受指向 PROGMEM 的指针吗?当然,在函数内部,我们必须使用PROGMEMfunctions来访问数据。 当然 - 程序指针只是一个值 - 可以移交给 PROGMEM 函数以将其取消引用到程序空间中。但是,并行使用“普通”和 PROGMEM 指针可能会非常混乱(您可以取消引用其中一个,但不能取消引用另一个),因此建议将内存临时复制到 RAM 并使用“普通”指针对其进行处理。 @tofro 我可以问你更多信息吗?【参考方案2】:

将字符串从闪存复制到 RAM

#include<avr/pgmspace.h>
const byte Update_1[5]  PROGMEM = 0x01, 0xB2, 0x02, 0xFF, 0xFF;
byte buffer2[5];
setup 
  memcpy_P (buffer2, &(Update_1),5);

【讨论】:

以上是关于arduino 闪存阵列的主要内容,如果未能解决你的问题,请参考以下文章

Arduino Yun中的闪存问题

Arduino-ESP32闪存文件插件程序搭建和上传

原创Arduino制作Badusb实践

arduinooled库占用内存

Arduino ESP8266利用SPIFFS上传文件和查看文件

Arduino PROGMEM静态存储区的使用介绍