Arduino:轻量级压缩算法,用于将数据存储在EEPROM中

时间:2009-10-22 09:41:20

标签: algorithm embedded compression arduino atmega

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

我的想法是利用压缩算法去除大小。但是,我对压缩算法的了解非常少,而且我对即用型库的搜索失败了。

那么,是否有一种优化存储大小的好方法?

8 个答案:

答案 0 :(得分:16)

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

您可能会对芯片上的EEPROM可用存储量有些误解;根据数据表,我有EEPROM尺寸:

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

请注意,这些值是 bytes ,而不是您在问题中提到的KB。无论如何,这不是“shitload”。

答案 1 :(得分:7)

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

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

压缩任何更随机的内容,例如记录的数据,音频等,都会为AVR带来巨大的开销,你可以更好地获得一个串行EEPROM芯片来保存这些数据。 Arduino的网站上有interfacing with a 64K chip的页面,听起来如此。如果您想要更多,请查看使用SPI与SD卡接口,例如this audio shield

答案 2 :(得分:3)

A NASA study here(后记)

A repost of 1989 article on LZW here

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

答案 3 :(得分:3)

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

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

但我发现在最近的Arduinos上使用的ATmega328只有512字节到2 kB SRAM,所以甚至LZS也可能太大了。我相信你可以使用一个较小字典的变体,但我不确定你会达到什么压缩比。

答案 4 :(得分:1)

您可能还想看看LZJB,非常简短,轻巧。

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

<mark><byte><count>

这是一种超级简单的算法,您可以用几行代码编写自己的代码。

答案 7 :(得分:0)

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