2016-11-21 80 views
0

我有一个二进制数字的三维数组,我用它作为一个字典,并通过一个LED阵列。该字典涵盖27个字母,每个字母涵盖30x30像素(其中每个像素为0或1)。Arduino二元阵列太大

我使用的是英特尔爱迪生 - 代码运行良好 - 但是在连接到我的电脑时遇到问题(尽管更换一次)后,我放弃了爱迪生。我切换到Arduino Uno,但现在收到一个数组太大的错误。

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

下面的代码的剪断:

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 */ 

回答

0

你可以把它写成

#include <stdint.h> 

//... 

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

..其中每个条目包含打包成一个32位的数字30位。 大小小于4k字节。

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

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

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