Arduino二进制数组太大了

时间:2016-11-21 00:15:31

标签: arrays memory binary arduino-uno

我有一个二维数字的三维数组,我用作字典并通过LED数组。字典涵盖27个字母,每个字母覆盖30x30像素(每个像素为0或1)。

我使用的是英特尔爱迪生 - 而且代码运行良好 - 但是我把爱迪生连接到我的电脑后放弃了(尽管已经更换了一次)。我切换到Arduino Uno,但现在收到的错误是阵列太大了。

现在我将数组设置为布尔值。无论如何通过将其设置为位来减少阵列的内存需求?该数组仅包含0和1。

这里是代码片段:

boolean PHDict[27][30][30] = {  
/* A */ {{ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0}, /* this is one column of thirty, that show "A" as a letter */

1 个答案:

答案 0 :(得分:0)

你可以把它写成

#include <stdint.h>

//...

uint32_t PHdict[27][30] = {
{ 0x00004000, ... },
....
};

..每个条目包含30位打包成32位数字。 大小不到4k字节。

在读取数组时需要一些代码来解压缩位,以及生成打包值的方法(即在“主机”计算机上运行的程序,并为源代码生成初始化数组)

对于AVR处理器,还有一种方法可以告诉编译器你希望数组存储在PM(闪存)而不是DM中 - 我想如果你在DM中有它,编译器将需要将初始化数据放入PM无论如何,并在程序启动之前将其复制,因此将其明确存储在PM中是个好主意。见https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes

实际上,根据处理器中闪存的数量,将其更改为PM可能足以解决问题,而无需打包。