【问题标题】:Arduino: Lightweight compression algorithm to store data in EEPROMArduino:将数据存储在 EEPROM 中的轻量级压缩算法
【发布时间】:2010-12-09 00:45:28
【问题描述】:

我想使用ATmega168/ATmega328 微控制器将大量数据存储到我的 Arduino 上,但遗憾的是只有 256 KB / 512 KB 的 EEPROM 存储空间。

我的想法是使用压缩算法来减少大小。但是,我对压缩算法的了解非常少,而且我对现成库的搜索失败了。

那么,有没有优化存储大小的好方法呢?

【问题讨论】:

  • 256 KB 的 EEPROM?根据Atmel page for ATmega168,它有 512 字节的 EEPROM(是的,字节),ATmega328 有 1024 字节的 EEPROM。它是微控制器外部的 EEPROM 吗?

标签: algorithm embedded compression arduino atmega


【解决方案1】:

类似LZSS 的算法对于嵌入式平台来说可能是一个不错的选择。它们是简单的算法,不需要太多内存。

LZS 是我熟悉的一个。它使用 2 kB 字典进行压缩和解压缩(字典是未压缩数据流的最新 2 kB)。 (LZS was patented by HiFn,不过据我所知,所有专利都已过期。)

但我看到最近的 Arduino 上使用的 ATmega328 只有 512 字节到 2 kB SRAM,所以可能连 LZS 都太大了。我确定您可以使用具有较小字典的变体,但我不确定您会达到什么压缩比。

【讨论】:

    【解决方案2】:

    是否不能选择外部 EEPROM(例如通过 I2C)?即使您使用压缩算法,不利的一面是您可能存储在内部 EEPROM 中的数据大小可能不再以简单的方式确定。 而且,如果你真的是说 kBYTES,那么考虑一个连接到 SPI 的 SDCard……网络上有一些轻量级的开源 FAT 兼容文件系统。

    【讨论】:

      【解决方案3】:

      如果您只想删除一些重复的零等,请使用Run-length encoding 重复的字节序列将被存储为:

      <mark><byte><count>
      

      这是一个超级简单的算法,您可能只需几行代码就可以自己编写代码。

      【讨论】:

        【解决方案4】:

        您可能还想看看LZJB,它非常简短、简单且轻量级。

        另外,FastLZ 可能值得一看。它比 LZJB 获得更好的压缩比,并且对解压缩的内存要求非常低:

        【讨论】:

        • 您在答案的末尾放了一个冒号。你的答案被截断了吗?
        【解决方案5】:

        论文“延迟容忍网络中能量受限设备的数据压缩算法”中描述的方法可能在ATmega328 上运行。

        参考:C. Sadler 和 M. Martonosi,“延迟容忍网络中能量受限设备的数据压缩算法”,2006 年 ACM 嵌入式网络传感器系统 (SenSys) 会议论文集,2006 年 11 月。.pdf。 MSPGCC 的 S-LZW 源代码:slzw.tar.gz。 2007 年 3 月 10 日更新。

        【讨论】:

          【解决方案6】:

          AVR 最多只有几千字节的 EEPROM,很少有超过 64K 的闪存(标准的 Arduino 没有)。

          如果您需要存储一些东西并且很少修改,例如图像,您可以尝试使用 Flash,因为那里有更多空间可以使用。对于简单的图像,一些粗略的 RLE 编码会有很长的路要走。

          压缩任何更随机的东西,例如记录的数据、音频等,将占用 AVR 的大量开销,如果你有一个串行 EEPROM 芯片来保存这些数据,你会更幸运。 Arduino 的网站在interfacing with a 64K chip 上有一个页面,听起来很不错。如果您想要更多,请查看使用 SPI 与 SD 卡连接,例如 this audio shield

          【讨论】:

            【解决方案7】:

            A NASA study here(后记)

            A repost of 1989 article on LZW here

            保持简单并分析添加压缩的成本/支出。这包括时间和精力、复杂性、资源使用情况、数据可压缩性等。

            【讨论】:

              【解决方案8】:

              您可能会查看LZO 算法,该算法旨在实现轻量级。我不知道AVR系统是否有任何实现,但可能你可以自己实现。

              不过,您可能对芯片上 EEPROM 中可用的存储量有些误解;根据数据表,我的 EEPROM 大小为:

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

              请注意,这些值以 字节 为单位,而不是您在问题中提到的 KB。这无论如何都不是“垃圾”。

              【讨论】:

              • LZO 在压缩过程中显然需要 8 或 64 KB 内存,这可能是这些处理器的问题
              • 我想这取决于应用程序是什么;该问题没有说明数据是由 Arduino 压缩,还是由其他东西压缩并由 Arduino 解压缩。我假设了减压情况。
              • 感谢您的建议。抱歉,确实,我混淆了 EEPROM 的大小,Greg 是对的。事实上,实际上我只需要减压部分。好吧,我会试一试..
              • 还有minilzo,它只包含一个c文件和几个include。可能不适合您的应用程序,但它可能会在很多情况下工作。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多