我有许多存储在闪存中的不同大小的数组。 我可以使用
访问单个数组条目byte j = pgm_read_byte(&(array[x]));
我想要做的是将数组从闪存作为参数传递给函数。我试过给一个指向数组的指针,作为一个参数,但这给出了一个编译错误:
void callPGM2(byte arr_size, byte *arr) {
..
..
}
ptr2 = &pgm_read_byte(&(array_1[0]));
callPGM2(5, &ptr2);
完整数组是否可以作为函数参数从闪存传递?
答案 0 :(得分:2)
没有办法直接传递指向PROGMEM变量的指针,因为AVR的哈佛架构有2个地址空间,C无法直接表达 - 你需要临时复制内存到例如,使用memcpy_P
的RAM。
您想了解 pgmspace 库中提供的功能。它与许多C函数(例如strcmp
)等价,允许您在程序空间中使用常量参数。
答案 1 :(得分:0)
我按照你的建议查看了avr / pgmspace lib,然后转到了avr站点。我使用以下代码生成一个表来存储我认为指向存储在flash men中的两个数组的指针。 当我使用memcpy_P然后打印以查看数据是否正确传输到堆时,我只得到值' 0x35'在buffer2数组的location [0]中。我认为这是垃圾。
mvn clean compile
如果我将数组buffer2的索引递增1,当串行打印检查结果时,我得到的值是我在上一个索引中的预期值?它就像使用memcpy_P函数从某处添加一个值..' 0x35'
mvn clean compile
我错过了能够从闪存中复制数组的内容。
答案 2 :(得分:0)
将字符串从闪存复制到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);
}