我想用ATmega168 / ATmega328微控制器将大量数据存储到我的 Arduino 上,但不幸的是只有 256 KB / 512 KB 的 EEPROM 存储空间。
我的想法是使用压缩算法来减少大小。但是,我对压缩算法的了解非常少,而且我对现成库的搜索失败了。
那么,有没有优化存储大小的好方法呢?
我想用ATmega168 / ATmega328微控制器将大量数据存储到我的 Arduino 上,但不幸的是只有 256 KB / 512 KB 的 EEPROM 存储空间。
我的想法是使用压缩算法来减少大小。但是,我对压缩算法的了解非常少,而且我对现成库的搜索失败了。
那么,有没有优化存储大小的好方法呢?
你可以看看LZO算法,它被设计成轻量级的。我不知道 AVR 系统是否有任何实现,但它可能是您可以自己实现的。
不过,您可能对芯片上 EEPROM 中可用的存储量有些误解;根据数据表,我的 EEPROM 尺寸为:
ATmega48P:256
ATmega88P:512
ATmega168P:512
ATmega256P:1024
请注意,这些值以bytes为单位,而不是您在问题中提到的 KB 。无论如何,这都不是“垃圾”。
AVR 最多只有几千字节的 EEPROM,很少有超过 64K 的闪存(标准的 Arduino 没有)。
如果您需要存储一些东西并且很少修改,例如图像,您可以尝试使用 Flash,因为那里有更多的空间可以使用。对于简单的图像,一些粗略的 RLE 编码将有很长的路要走。
压缩任何更随机的东西,例如记录的数据、音频等,将占用 AVR 的大量开销,您将有更好的运气获得串行 EEPROM 芯片来保存这些数据。Arduino 的网站上有一个关于与 64K 芯片接口的页面,听起来不错。如果您想要更多,请查看使用 SPI 与 SD 卡连接,例如在此音频屏蔽中
像LZSS这样的算法对于嵌入式平台来说可能是一个不错的选择。它们是简单的算法,不需要太多内存。
LZS是我熟悉的一个。它使用 2 kB 字典进行压缩和解压缩(字典是未压缩数据流的最新 2 kB)。(LZS 是 HiFn 的专利,但据我所知,所有专利都已过期。)
但我看到最近的 Arduino 上使用的ATmega328只有 512 字节到 2 kB SRAM,所以即使 LZS 也可能太大了。我确定您可以使用具有较小字典的变体,但我不确定您会达到什么压缩比。
外部 EEPROM(例如通过 I2C)不是一种选择吗?即使您使用压缩算法,不利的一面是您可能存储在内部 EEPROM 中的数据大小可能不再以简单的方式确定。而且,如果您真的是指 kBYTES,那么请考虑连接 SDCard到 SPI... 网上有一些轻量级的开源 FAT 兼容文件系统。