Arduino: легкий алгоритм сжатия для хранения данных в EEPROM

StackOverflow https://stackoverflow.com/questions/1606102

Вопрос

Я хочу сохранить большой объем данных на моем Arduino с помощью ATmega168 / ATmega328 микроконтроллер, но, к сожалению, всего 256 КБ / 512 КБ памяти EEPROM.

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

Итак, есть ли хороший способ оптимизировать размер хранилища?

Это было полезно?

Решение

Вы можете взглянуть на алгоритм LZO , который разработан для упрощения. Я не знаю, есть ли какие-либо реализации для системы AVR, но это может быть то, что вы могли бы реализовать самостоятельно.

Вы можете быть несколько дезинформированы об объеме памяти, доступной в EEPROM на вашем чипе; в соответствии с таблицей у меня есть размеры EEPROM:

ATmega48P: 256
ATmega88P: 512
ATmega168P: 512
ATmega256P: 1024

Обратите внимание, что эти значения находятся в байтах , а не в килобайтах, как вы упоминаете в своем вопросе. Это ни в коей мере не является «shitload».

Другие советы

AVR имеют максимум несколько килобайт EEPROM, и очень немногие имеют Flash более 64K (нет стандартного Arduinos).

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

Сжатие чего-либо более случайного, например записанных данных, аудио и т. д., потребует огромных накладных расходов на AVR, и вам больше повезет, если вы получите последовательный чип EEPROM для хранения этих данных. На сайте Arduino есть страница по адресу взаимодействует с чипом 64 КБ , что звучит. Если вы хотите большего, посмотрите на взаимодействие с SD-картой с SPI, например, в этом звуковой щит

исследование НАСА здесь (Postscript)

Репост статьи 1989 года о LZW здесь

Будьте проще и проведите анализ затрат / выплат на добавление сжатия. Это включает время и усилия, сложность, использование ресурсов, сжимаемость данных и т. Д.

Алгоритм, подобный LZSS , вероятно, будет хорошим выбором для встроенной платформы. Это простые алгоритмы, и им не нужно много памяти.

LZS - это тот, с которым я знаком. Он использует словарь 2 КБ для сжатия и распаковки (словарь является самым последним 2 КБ потока несжатых данных). ( LZS был запатентован HiFn , однако, насколько я могу судить, срок действия всех патентов истек.)

Но я вижу, что ATmega328 , используемый в недавних Arduinos , имеет только 512 байтов до 2 КБ SRAM, так что, возможно, даже LZS слишком велик для него. Я уверен, что вы могли бы использовать вариант с меньшим словарем, но я не уверен, каких коэффициентов сжатия вы бы достигли.

Метод, описанный в статье «Алгоритмы сжатия данных для устройств с ограниченным энергопотреблением в сетях с устойчивой задержкой» # 8221; может работать на ATmega328 .

Ссылка: C. Sadler и M. Martonosi, & # 8220; Алгоритмы сжатия данных для устройств с ограниченным энергопотреблением в сетях с задержкой толерантности, & # 8221; Материалы конференции ACM по встроенным сетевым сенсорным системам (SenSys) 2006, ноябрь 2006. .pdf. S-LZW Источник для MSPGCC: slzw.tar.gz. Обновлено 10 марта 2007 года.

Вы также можете взглянуть на LZJB , очень короткий, простой и легкий.

Кроме того, FastLZ может стоить посмотреть. Он получает лучшие коэффициенты сжатия, чем LZJB, и имеет довольно минимальные требования к памяти для распаковки:

Если вы просто хотите удалить несколько повторяющихся нулей или что-то подобное, используйте кодировку длины выполнения Повторяющиеся последовательности байтов будут сохранены как:

<mark><byte><count>

Это очень простой алгоритм, который вы, вероятно, можете кодировать самостоятельно в несколько строк кода.

Внешняя EEPROM (например, через I2C) не вариант? Даже если вы используете алгоритм сжатия, недостатком является то, что размер данных, которые вы можете хранить во внутренней EEPROM, может быть не определен простым способом больше. И, конечно, если вы действительно имеете в виду kBYTES, то рассмотрите SDCard, подключенную к SPI ... В сети есть несколько облегченных FAT-совместимых файловых систем с открытым исходным кодом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top