使用PROGMEM时我错过了什么?

时间:2014-08-29 19:34:13

标签: c++ arduino progmem

所以我试图在我的Arduino上的程序存储器中存储一个多维CHAR数组,并且我在使它工作时遇到了问题。这就是我所拥有的......

typedef unsigned char RGBBitmap[8][8][3];
typedef prog_uchar ProgRGBBitmap[8][8][3]; // Have to use prog_uchar for stuff stored in progmem

ProgRGBBitmap Mailbox[3] PROGMEM = 
{
    ... // some initializing data
};

根据PROGMEM文档,要获取指向char数据的指针,您应该使用pgm_read_word调用。但是,当我尝试使用此功能阅读它时...

RGBBitmap * pMailbox0 = (RGBBitmap*)pgm_read_word( &Mailbox[0] );

......我回来的只是垃圾。

如果我删除PROGMEM行并且仅使用RGBBitmap指针并删除pgm_read_word,那么它可以工作,但是然后它在RAM中,我就不在了。

那我在这里错过了什么?

1 个答案:

答案 0 :(得分:0)

您的数组是一个值块。像这样,您的代码定义了一个连续的值块:

ProgRGBBitmap Mailbox[3] PROGMEM = {...};
... removing typedef is same as ...
prog_uchar Mailbox[3][8][8][3] = {...};

所以你无法从程序存储器中读取指针,因为它们没有存储在那里。该块都是uchar的。

您的所有值都是字节,因此您可以使用以下内容读取该块中的任何值:

uc = (uchar)pgm_read_byte( someaddress );

现在,4维数组的棘手部分是使地址语法正确。

uc = (uchar)pgm_read_byte( &Mailbox[i][x][y][c] );

编译器将为[i] ... [c]插入指针算法,这可能在循环中浪费。所以你可以预先计算指针的一部分,这就是我想你想要实现的目标。像这样的东西会节省一些代码和时钟滴答声:

ProgRGBBitmap* ptrOneBox = &(Mailbox[i]);  // this will be pointer into block
for(x ...
  for(y ....
    uc = (uchar)pgm_read_byte( &(ptrOneBox[x][y][c]) ); // this indexes out one byte

指针和数组在没有工作时会让你发疯。在没有调试器的平台上投入PROGMEM ......

将问题简化为更简单的情况并重新开始工作。