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

17
我想在配备ATmega168/ATmega328微控制器的Arduino上存储大量数据,但EEPROM存储器仅有256KB/512KB。我的想法是利用压缩算法来减小数据大小。然而,我的压缩算法知识相当有限,我搜索现成库也没有成功。所以,有没有好的方法来优化存储大小呢?

2
256 KB的EEPROM?根据Atmel ATmega168页面上的说明,它有512字节的EEPROM(是的,字节),而ATmega328则有1024字节的EEPROM。这个EEPROM是不是外部的微控制器? - Peter Mortensen
9个回答

16

您可以看看 LZO 算法,它被设计成轻量级。我不知道 AVR 系统上是否有任何实现,但这可能是您可以自己实现的东西。

然而,您对芯片 EEPROM 存储器可用空间的了解可能有些误导;根据我所持有的数据表,EEPROM 大小如下:

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

请注意,这些值是以字节为单位,而不是您在问题中提到的 KB。这绝不是“很多”的存储容量。


3
LZO在压缩过程中需要8或64KB的内存,这可能会成为这些处理器的一个问题。 - fvu
我猜这取决于应用程序;问题没有说明数据是由Arduino压缩,还是由其他东西压缩并由Arduino解压缩。我假设是解压缩情况。 - Greg Hewgill
谢谢您的建议。很抱歉,我混淆了EEPROM的大小,Greg是正确的。实际上,我只需要解压缩部分。好的,我会尝试一下。 - RngTng
还有一个叫做minilzo的东西,它只包含一个C文件和几个头文件。可能不适用于您的应用程序,但在许多情况下它都可以工作。 - Andrew Smith

7
AVR只有最多几千字节的EEPROM,很少有超过64K Flash(没有标准的Arduino有)。如果您需要存储某些东西并且很少修改,例如图像,您可以尝试使用Flash,因为那里有更多的空间可供使用。对于简单的图像,一些粗糙的RLE编码会有很大帮助。压缩任何更随机的东西,例如记录的数据、音频等,将需要巨大的AVR开销,您将更容易获得串行EEPROM芯片来存储这些数据。Arduino网站上有一个页面与64K芯片接口,听起来很不错。如果您需要更多,请查看使用SPI接口SD卡的界面,例如此音频盾

3

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

LZS是我熟悉的一种算法。它使用2 kB字典进行压缩和解压缩(字典是未压缩数据流的最近2 kB)。 (LZS由HiFn公司申请了专利,但据我所知,所有专利都已过期。)

但我发现,最近的Arduino使用的ATmega328仅具有512字节到2 kB SRAM,因此即使是LZS也可能太大了。我相信您可以使用带有较小字典的变体,但我不确定您将获得什么压缩比。


3

1

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

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


1

你可能也想看看LZJB,它非常简短、简单和轻量级。

此外,FastLZ 也值得一看。它比LZJB获得更好的压缩比,并且在解压缩方面具有相当小的内存需求:


1
你在回答的末尾放了一个冒号。你的回答被截断了吗? - starbeamrainbowlabs

0

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

<mark><byte><count>

这是一个超级简单的算法,你可能只需要几行代码就能编写出来。


0

外部EEPROM(例如通过I2C)不是一个选项吗?即使使用压缩算法,缺点是您可以存储在内部EEPROM中的数据大小可能不再以简单的方式确定.. 如果您确实需要k字节,那么考虑连接到SPI的SD卡...网络上有一些轻量级开源FAT兼容文件系统。


0

heatshrink 是一个基于LZSS算法的用于嵌入式/实时系统数据压缩/解压缩库。据说它可以在少于100字节的内存中运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接