2016-11-21 2 views
0

У меня есть трехмерный массив двоичных чисел, который я использую в качестве словаря и передаю через светодиодную матрицу. Словарь охватывает 27 букв, и каждая буква охватывает 30x30 пикселей (где каждый пиксель равен 0 или 1).Arduino Binary Array слишком большой

Я использовал Intel Edison - и код работал хорошо - но я отбросил Edison после того, как у меня возникли проблемы с подключением его к компьютеру (несмотря на его замену один раз). Я переключился на Arduino Uno, но теперь получаю ошибку, что массив слишком велик.

Прямо сейчас у меня есть массив, заданный как boolean. Есть ли способ уменьшить требования к памяти массива, установив его вместо битов? Массив состоит только из нулей и единиц.

Вот надрез кода:

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, ... }, 
.... 
}; 

.. Где каждая запись содержит 30 бит, упакованные в 32-разрядное число. Размер составляет менее 4 килобайт.

Вам понадобится немного кода для распаковки битов при чтении массива и способа создания упакованных значений (т.е. программа, которая запускается на вашем компьютере «хозяин» и генерирует инициализированный массив для исходного кода)

Для процессора AVR есть также способ сообщить компилятору, что вы хотите сохранить массив, хранящийся в PM (флэш-память), вместо DM - я думаю, если у вас есть это в DM, то компилятору нужно будет инициализировать данные в PM в любом случае и скопировать его до начала программы, поэтому рекомендуется четко хранить его в PM. См. https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes

Фактически, в зависимости от объема флэш-памяти в процессоре, изменение его на PM может быть достаточным для решения проблемы, без необходимости накапливать бит.

Смежные вопросы