首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在使用PROGMEM时遗漏了什么?

我在使用PROGMEM时遗漏了什么?
EN

Stack Overflow用户
提问于 2014-08-29 19:34:13
回答 1查看 1.1K关注 0票数 0

因此,我试图在我的Arduino上的程序内存中存储一个多维CHAR数组,并且我很难让它正常工作。这是我拥有的..。

代码语言:javascript
复制
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调用。不过,当我试着用这个读出来的时候.

代码语言:javascript
复制
RGBBitmap * pMailbox0 = (RGBBitmap*)pgm_read_word( &Mailbox[0] );

...all我回来就是垃圾。

如果我删除PROGMEM行,只使用RGBBitmap指针并删除pgm_read_word,它就能工作,但它在内存中工作,这是我无法使用的。

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-30 02:27:02

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

代码语言:javascript
复制
ProgRGBBitmap Mailbox[3] PROGMEM = {...};
... removing typedef is same as ...
prog_uchar Mailbox[3][8][8][3] = {...};

因此,您不能从程序内存中读取指针,因为它们没有存储在那里。街区都是布哈尔的。

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

代码语言:javascript
复制
uc = (uchar)pgm_read_byte( someaddress );

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

代码语言:javascript
复制
uc = (uchar)pgm_read_byte( &Mailbox[i][x][y][c] );

编译器将插入i.c的指针算法,这在循环中可能是浪费的。所以你可以预先计算出指针的一部分,我想这是你想要完成的。像这样的东西可以节省一些代码和时钟:

代码语言:javascript
复制
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 .

把这个问题简化为一个简单的例子,然后重新开始工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25575056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档