2016-11-21 74 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可能足以解決問題,無需打包比特。