Я разрабатываю программу для uC, которая читает в 40-битном массиве бит через SPI. Этот 40-байтовый массив является тестовым вектором, который сравнивается с «известным хорошим» тестовым вектором, который хранится на SD-карте.Malloc, Variable Length Array или Static Array?
Чтобы найти аномалии/ошибки/ошибки, I XOR каждый байт полученного тестового вектора с сохраненными данными. Это приводит к бит-массиву, в котором есть «1», где ложь лежит. Я могу легко найти положение этих «1», используя следующие algorithm.
Проблема заключается в сохранении положения этих «1». В настоящее время я использую Variable Length Arrays, но поддержка для них нарушена в GCC4.2, и поэтому я не уверен, насколько они надежны в AVR-GCC.
Моя следующая мысль заключалась в использовании malloc
, но это обычно обескураживает встроенные системы. Должен ли я просто объявить массив unsigned char длиной 320 и сохранить «1», когда я нахожу бит набора? Пример: я нахожу бит 4, 8, 10, 42 и 250, установленные в моем битовом массиве. Затем я устанавливаю соответствующие элементы в «1», чтобы указать, что на этих позициях обнаружено «1». Это займет 320 байт моей SRAM. В качестве альтернативы я могу объявить массив как int и сохранить фактическую позицию, начиная с вершины массива.
Почему мне нужно положение битов? Карта SD содержит другой файл, который имеет информацию, соответствующую позиции в массиве бит. Таким образом, если ошибка обнаружена в позиции 24, программа может перейти и прочитать файл и отобразить информацию обо всем, что знает, что связано с позицией 24.
ПРИМЕЧАНИЕ. Некоторые могут задаться вопросом, нужно ли мне читать во всем тесте вектор сразу. Это действительно так.
Будет ли массив символов хранить «1», где были установлены биты или массив int для хранения фактических позиций? – saad
@saad, если вы можете сэкономить место, будет легче хранить каждый бит в переменной 'char'. Если нет, вам нужно будет хранить биты и использовать маскировку и смещение бит, чтобы получить их. – paxdiablo
Возможно, я что-то недопонимаю, но мне не нужно маскировать или бить. Если у меня есть массив int, а первый «1», с которым я сталкиваюсь в моем битном массиве, равен 20, я сохраняю 20 в 0-м элементе в массиве int. Это будет массив позиций битов. Это потребует большего объема памяти (в два раза больше), но сократит время обработки, потому что цикл будет выполняться только в течение n раз, где n - это общее количество бит, которые были установлены в битовом массиве. Текущая система имеет 8K SRAM, из которых 40% уже потребляется. Мы добавим дополнительную SRAM - до 64K - при следующем вращении досок. – saad