Arduino:EEPROMにデータを保存するための軽量圧縮アルゴリズム
-
05-07-2019 - |
解決
LZO アルゴリズムは、軽量に設計されています。 AVRシステムの実装があるかどうかはわかりませんが、自分で実装できるものかもしれません。
ただし、チップのEEPROMで利用可能なストレージの量について、多少の誤解を覚えているかもしれません。 EEPROMのサイズは次のとおりです。
ATmega48P:256
ATmega88P:512
ATmega168P:512
ATmega256P:1024
これらの値は、質問で言及したKBではなく、バイトであることに注意してください。これは、決して「たわごと」ではありません。
他のヒント
AVRには最大で数キロバイトのEEPROMしかなく、64K以上のフラッシュを搭載しているものはほとんどありません(標準のArduinoにはありません)。
何かを保存する必要があり、たとえば画像をめったに変更しない場合は、作業するスペースがはるかに多いため、Flashを使用してみてください。単純な画像の場合、粗雑なRLEエンコーディングは大いに役立ちます。
たとえば、ログに記録されたデータ、オーディオなど、よりランダムなものを圧縮すると、AVRに多大なオーバーヘッドがかかります。このデータを保持するためにシリアルEEPROMチップを入手するのは幸運です。 Arduinoのサイトには、 64Kチップとのインターフェース。それ以上の機能が必要な場合は、たとえば thisでSPIを使用したSDカードとのインターフェースを確認してください。オーディオシールド
NASAの調査はこちら(追記)
シンプルに保ち、圧縮を追加するコスト/支払いの分析を実行します。これには、時間と労力、複雑さ、リソース使用量、データ圧縮率などが含まれます。
LZSS のようなアルゴリズムがおそらく適切な選択です組み込みプラットフォーム用。それらは単純なアルゴリズムであり、多くのメモリを必要としません。
LZS は、私がよく知っているものです。圧縮と解凍に2 kBの辞書を使用します(辞書は、非圧縮データストリームの最新の2 kBです)。 ( LZSはHiFnが特許を取得しました、しかし、私が知る限り、すべての特許は失効しています。)
しかし、最近のArduinosで使用されている ATmega328 、512 KB〜2 kBのSRAMしか持っていないため、LZSでも大きすぎます。より小さな辞書でバリアントを使用できると確信していますが、どの圧縮率を達成できるかわかりません。
繰り返しゼロなどを削除する場合は、ランレングスエンコーディング 繰り返しバイトシーケンスは次のように保存されます。
<mark><byte><count>
これは非常にシンプルなアルゴリズムで、おそらく数行のコードで自分でコーディングできます。
外部EEPROM(たとえばI2C経由)はオプションではありませんか?圧縮アルゴリズムを使用した場合でも、内部EEPROMに保存できるデータのサイズが簡単な方法で決定されなくなる可能性があるという欠点があります。 そして、もしあなたが本当にkBYTESを意味するなら、SPIに接続されたSDCardを考えてみてください...ネットには軽量のオープンソースFAT互換ファイルシステムがいくつかあります。