Frage

ich eine große Menge an Daten auf meinem Arduino mit einem ATmega168 speichern möchten / ATmega328 Mikrocontroller, aber leider gibt es nur 256 KB / 512 KB EEPROM Speicher.

Meine Idee ist die Verwendung eines Kompressionsalgorithmus, um die Größe auszuziehen. Aber gut, mein Wissen über Komprimierungsalgorithmen ist ziemlich niedrig und meine Suche nach ready-to-use-Bibliotheken fehlgeschlagen.

Also, gibt es eine gute Möglichkeit, die Speichergröße zu optimieren?

War es hilfreich?

Lösung

Sie können einen Blick auf die LZO Algorithmus, der sich durch geringes Gewicht ausgelegt ist. Ich weiß nicht, ob es irgendwelche Implementierungen für das AVR-System ist, aber es könnte sein, etwas, das Sie selbst implementieren könnten.

Sie können jedoch über die Menge an Speicher in EEPROM auf dem Chip etwas falsch informiert sein; nach dem Datenblatt I die EEPROM-Größen haben, sind:

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

Hinweis

, dass diese Werte in Bytes , nicht KB, wie Sie in Ihrer Frage erwähnen. Dies ist nicht, durch eine Maßnahme, eine „Unmenge“.

Andere Tipps

AVRs haben nur wenige Kilobyte EEPROM am meisten, und nur sehr wenige haben viel mehr als 64 KB Flash (keine Standard Arduinos tun).

Wenn Sie benötigen etwas zu speichern und nur selten zu ändern, zum Beispiel ein Bild, können Sie versuchen, die Verwendung von Flash, da es viel mehr Platz gibt es mit zu arbeiten. Für einfache Bilder würden einige rohe RLE-Codierung einen langen Weg gehen.

Komprimieren von etwas mehr zufällig, zum Beispiel Daten protokolliert, Audio, usw., wird eine enorme Menge an Overhead für den AVR nehmen, werden Sie mehr Glück haben einen seriellen EEPROM-Chip bekommen, diese Daten zu halten. Arduino Website hat eine Seite auf mit einem 64K-Chip Schnittstelle, die sich anhört. Wenn Sie mehr als das wollen, suchen Sie mit einer SD-Karte mit SPI an Schnittstellen, zum Beispiel in diese Audio-Schild

Eine NASA-Studie hier (Postscript)

ein Repost 1989 Artikel über LZW hier

Halten Sie es einfach und durchführen Analyse der Kosten / Auszahlung der Kompression hinzufügen. Dazu gehören Zeit und Aufwand, Komplexität, Ressourcennutzung, Daten Kompressibilität, etc.

Ein Algorithmus so etwas wie LZSS wäre wahrscheinlich eine gute Wahl sein, für eine eingebettete Plattform. Sie sind einfache Algorithmen, und nicht viel Speicher benötigen.

LZS ist ein Ich bin vertraut mit. Es verwendet einen 2 kB Wörterbuch für die Komprimierung und Dekomprimierung (Wörterbuch ist der jüngste 2 kB des unkomprimierten Datenstrom). ( LZS wurde von HiFn patentiert , aber soweit ich das beurteilen kann, haben alle Patente abgelaufen.)

Aber ich sehe, dass ein ATmega328 , verwendet auf den letzten Arduinos , hat nur 512 Byte bis 2 kB SRAM, vielleicht sogar LZS für sie zu groß ist. Ich bin sicher, dass Sie eine Variante mit einem kleineren Wörterbuch verwenden könnten, aber ich bin nicht sicher, welche Kompressionsverhältnisse würden Sie erreichen.

Das Verfahren in dem Papier „Datenkompressionsalgorithmen für Energie-Constrained-Geräte in verzögerungstoleranten Netzwerken“ beschrieben könnte auf einem ausführen ATmega328 .

Referenz: C. Sadler und M. Martonosi, „Datenkompressionsalgorithmen für Energie-Constrained-Geräte in verzögerungstoleranten Netzwerken“ Proceedings of the ACM Conference on Embedded Networked Sensorsysteme (SenSys) 2006, November 2006. .pdf. S-LZW Quelle für MSPGCC: slzw.tar.gz. Aktualisiert 10. März 2007.

Sie möchten vielleicht auch unter lzjb , ist sehr kurz, einfach und leicht.

Auch FastLZ könnte einen Blick wert sein. Es kommt noch besser Kompressionsraten als lzjb und hat ziemlich minimale Speicheranforderungen für die Dekompression:

Wenn Sie nur einige sich wiederholende Nullen oder so zu entfernen, verwenden Sie Run-Length Encoding Wiederholen von Byte-Sequenzen werden als gespeichert werden:

<mark><byte><count>

Es ist super-einfachen Algorithmus, die Sie wahrscheinlich selbst in wenigen Zeilen Code codieren können.

Ist ein externes EEPROM (zB über I2C) keine Option? Selbst wenn Sie einen Kompressionsalgorithmus der Seite nach unten verwenden, besteht darin, dass die Größe der Daten, die Sie im internen EEPROM speichern können nicht auf einfache Weise mehr bestimmt werden kann .. Und corse, wenn Sie wirklich KBytes bedeuten, dann eine SD-Karte mit dem SPI verbunden betrachten ... Es gibt einige leicht gewichtet Open-Source-FAT-kompatiblen Dateisystemen im Netz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top