17

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

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

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

4

8 回答 8

16

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

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

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

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

于 2009-10-22T10:01:29.837 回答
7

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

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

压缩任何更随机的东西,例如记录的数据、音频等,将占用 AVR 的大量开销,您将有更好的运气获得串行 EEPROM 芯片来保存这些数据。Arduino 的网站上有一个关于与 64K 芯片接口的页面,听起来不错。如果您想要更多,请查看使用 SPI 与 SD 卡连接,例如在此音频屏蔽中

于 2009-10-22T18:33:25.317 回答
3

美国宇航局的一项研究(后记)

1989 年关于 LZW 的文章转贴在这里

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

于 2009-10-22T10:03:53.813 回答
3

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

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

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

于 2009-11-04T23:54:32.467 回答
1

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

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

于 2009-11-15T05:10:35.070 回答
1

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

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

于 2010-03-31T11:13:40.603 回答
0

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

<mark><byte><count>

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

于 2014-11-14T09:53:32.937 回答
0

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

于 2014-11-19T21:33:59.153 回答