Более оперативный логический массив? Среда Arduino - PullRequest
5 голосов
/ 10 апреля 2011

У меня есть некоторый код, который у меня есть в среде Arduino, который требует x (с шагом 8) логических значений, которыми можно манипулировать во время выполнения для некоторого кода регистра сдвига.Поэтому в настоящее время я использую логический массив, например, так:

 #define number_of_shiftRegisters 220 //num of 8 bit shift registers

 #define numOfRegisterPins number_of_shiftRegisters * 8 //number of booleans needed

 boolean registers[numOfRegisterPins]; //boolean array

Но у меня не хватило ОЗУ около 200 (1600 логических значений), и я не знал, почему, пока не увидел, хотя логические значения 1 битони хранятся в 8 битах данных.

Как я уже говорил, количество необходимых булев всегда увеличивается с шагом 8, поэтому я не знаю, может ли это сработать в мою пользу.

Есть ли более эффективный способ хранения более 1000 логических значений и возможность ссылаться на них по индексу?

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

Я думал о массиве char, а затем о битовой маскировке каждого символа для доступа к отдельным битам.Но я не знал, есть ли более простой способ, или это займет значительно больше процессорного времени.

Ответы [ 2 ]

6 голосов
/ 10 апреля 2011

Да, вы можете легко использовать маскировку, чтобы обойти эту проблему ..

Каждый байт (беззнаковый символ) будет содержать 8 логических значений, чтобы получить i-й, вы можете просто использовать values & (1 << i), еслитесты, и это будет работать, поскольку, если установлен правильный бит, то результатом будет! = 0.

Чтобы установить бит, просто сдвиньте его и или на значение: values | (1 << i) (в случаеСнимите значение с 0).

Другое решение может заключаться в использовании упакованной структуры:

struct Bools
{
  int b1 : 1;
  int b2 : 1;
  int b3 : 1;
  ... // up to b8
}

Это должно управлять элементами с прямым доступом к логическому значению и позволит вамопределите объединение для управления ими либо как 8-битное логическое значение, либо как байты.

3 голосов
/ 10 апреля 2011

Вы можете иметь эффективную память или вычислительную эффективность, но вы не можете иметь обе одновременно.

Упаковка логических значений в массив unsigned char означает, что для любого произвольного доступа на чтение вам необходимо:

  1. Рассчитать смещение в массиве, в котором находится бит
  2. Получить этот элемент
  3. Рассчитать смещение в этот байт, в котором живет интересующий вас бит
  4. Сдвиньте этот байт много раз, чтобы расположить бит в наименьшей значащей позиции
  5. Маскировать все позиции, кроме наименее значимых
  6. Проверка на ноль / ненулевое значение

Хранение их в отдельных элементах массива сокращает его до:

  1. Извлеките элемент, содержащий интересующий вас булево значение
  2. Проверка на ноль / ненулевое значение

Выбор одного из другого зависит от того, как ваши хранилище и производительность должны сбалансировать друг другакак вы собираетесь использовать данные и какие компромиссы вы готовы сделать.В вашем случае такой подход с прямым доступом требует восьмикратного увеличения объема памяти, что приводит к нехватке памяти и вызывает сбой, поэтому он не рассматривается.Это оставляет упакованные биты за дополнительную обработку.

Если вы тратите много времени на итерации по всему или части набора, вы можете использовать упакованный подход и сократить некоторые вычисления, получивбайты только тогда, когда они вам нужны, и делают одну смену и маску каждый раз, когда вы идете после следующего бита. Делать это немедленно было бы преждевременным решением, так что просто держите его в заднем кармане, пока не обнаружите, что доступ фактически вызывает узкое место.Пусть ваша программа сначала запустит доступную память.

Также имейте в виду, что микроконтроллер, используемый в Arduino, не особенно сложен и не имеет больших регистров, поэтому упаковка в нечто большее, например unsigned intили unsigned long может в конечном итоге стать продуктивным.

...