質問

ATmega168 /でArduinoに大量のデータを保存したい ATmega328 マイクロコントローラーですが、残念ながら256  KB / 512&KBのEEPROMストレージしかありません。

私の考えは、圧縮アルゴリズムを使用してサイズを削減することです。しかし、まあ、圧縮アルゴリズムに関する私の知識は非常に低く、すぐに使用できるライブラリの検索は失敗しました。

では、ストレージサイズを最適化する良い方法はありますか?

役に立ちましたか?

解決

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の調査はこちら(追記)

LZWに関する1989年の記事の再投稿はこちら

シンプルに保ち、圧縮を追加するコスト/支払いの分析を実行します。これには、時間と労力、複雑さ、リソース使用量、データ圧縮率などが含まれます。

LZSS のようなアルゴリズムがおそらく適切な選択です組み込みプラットフォーム用。それらは単純なアルゴリズムであり、多くのメモリを必要としません。

LZS は、私がよく知っているものです。圧縮と解凍に2 kBの辞書を使用します(辞書は、非圧縮データストリームの最新の2 kBです)。 ( LZSはHiFnが特許を取得しました、しかし、私が知る限り、すべての特許は失効しています。)

しかし、最近のArduinosで使用されている ATmega328 、512 KB〜2 kBのSRAMしか持っていないため、LZSでも大きすぎます。より小さな辞書でバリアントを使用できると確信していますが、どの圧縮率を達成できるかわかりません。

論文“遅延耐性ネットワークにおけるエネルギー制約のあるデバイス向けのデータ圧縮アルゴリズム” ATmega328 で実行される可能性があります。

参照: C. Sadler とM. Martonosi、“遅延耐性ネットワークのエネルギー制約デバイス用のデータ圧縮アルゴリズム”組み込みネットワークセンサーシステムに関するACM会議(SenSys)2006、2006年11月の議事録。 MSPGCCのS-LZWソース:slzw.tar.gz。 2007年3月10日更新。

LZJB 。非常に短く、シンプルで、軽量です。

また、 FastLZ は一見の価値があります。 LZJBよりも優れた圧縮率が得られ、解凍に必要な最小限のメモリ要件があります。

外部EEPROM(たとえばI2C経由)はオプションではありませんか?圧縮アルゴリズムを使用した場合でも、内部EEPROMに保存できるデータのサイズが簡単な方法で決定されなくなる可能性があるという欠点があります。 そして、もしあなたが本当にkBYTESを意味するなら、SPIに接続されたSDCardを考えてみてください...ネットには軽量のオープンソースFAT互換ファイルシステムがいくつかあります。

scroll top