我有一个二维数字的三维数组,我用作字典并通过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 */
答案 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可能足以解决问题,而无需打包。