0

所以我试图在我的 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 中,我已经用完了。

那么我在这里错过了什么?

4

1 回答 1

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...

将问题简化为一个更简单的案例并进行备份。

于 2014-08-30T02:27:02.253 回答