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

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

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

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

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

此处的NASA研究报告(后记)

1989年关于LZW的文章的重新发布

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

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

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

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

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

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

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

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

如果您只是想删除一些重复的零件,请使用行程编码 重复字节序列将存储为:

<mark><byte><count>

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top