我想用ATmega168 / ATmega328微控制器将大量数据存储到我的Arduino上,但不幸的是,只有256 KB / 512 KB的EEPROM存储空间。
我的想法是利用压缩算法去除大小。但是,我对压缩算法的了解非常少,而且我对即用型库的搜索失败了。
那么,是否有一种优化存储大小的好方法?
答案 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 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)
答案 5 :(得分:1)
“延迟容忍网络中能量受限设备的数据压缩算法”一文中描述的方法可以在ATmega328上运行。
参考文献:C. Sadler和M. Martonosi,“延迟容忍网络中能量受限设备的数据压缩算法”,2006年11月举行的嵌入式网络传感器系统ACM会议论文集(SenSys).pdf 。 MSPGCC的S-LZW来源:slzw.tar.gz。 2007年3月10日更新。
答案 6 :(得分:0)
答案 7 :(得分:0)
外部EEPROM(例如通过I2C)不是一个选项吗?即使您使用压缩算法,不利的一面是您可能无法以简单的方式确定可能存储在内部EEPROM中的数据大小。 而且,如果你真的是指KBYTES,那么考虑将一个SDCard连接到SPI ......网中有一些轻量级的开源FAT兼容文件系统。