Forum: Mikrocontroller und Digitale Elektronik Programmcode komprimieren


von Max G. (l0wside) Benutzerseite


Lesenswert?

In meinem aktuellen Projekt möchte ich gerne Updates über den 
(vorhandenen, funktionierenden) Bus machen können.
Dazu habe ich mir folgenden Algorithmus überlegt:
-uC mit genügend Flash nehmen
-Neues Image via Bus in reservierten Flash-Bereich schreiben
-Neustart auslösen
-Nach jedem Neustart wird auf Vorhandensein eines gültigen Image geprüft
-Ist ein Image vorhanden, wird der bestehende Code damit überschrieben 
und das Image danach ungültig gemacht
-Nochmal Neustart, damit wird dann das neue Image geladen

Dafür brauche ich aber doppelt so viel Flash wie im Normalbetrieb. Nun 
habe ich das Problem, dass die verwendete uC-Familie (MSP430F530x) 
maximal 32k Flash hat, mein Image aber inzwischen 18k. uC-Familie 
wechseln wäre nur die allerletzte Option, auch externes EEPROM würde ich 
ungern einsetzen.

Fragen:
-Hat jemand Erfahrung damit, binären Programmcode zu komprimieren? 
Welche Kompressionsraten sind realistisch?
-Welche Verfahren sind uC-tauglich? zlib ist keine Option, da viel zu 
RAM-intensiv (ich habe nur 6k)

Gruß und guten Rutsch,

Max

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

das wird nix.

Verschlanke dein Programm, daß die notwendige Größe rauskommt, oder bau 
dir externen zusätzlichen Speicher dran.

von Kai S. (kai1986)


Lesenswert?

Hallo,

was spricht denn gegen einen klassischen Bootloader, der die Daten über 
den Bus empfängt und direkt den Programmspeicher überschreibt?

Gruß Kai

von Coder (Gast)


Lesenswert?

Optimierer schon eingeschaltet?

von Georg G. (df2au)


Lesenswert?

Kai S. schrieb:
> was spricht denn gegen einen klassischen Bootloader, der die Daten über
> den Bus empfängt und direkt den Programmspeicher überschreibt?

Er möchte überleben, auch wenn der Bootlader im letzten Rekord die 
Grätsche macht.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hallo,

schau dir mal LZO an.

> https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Oberhumer

Interessant daran ist besonders das hier:

> Requires no additional memory for decompression other than the source and
> destination buffers.

Für die Kompression werden zwar ab 8 kB RAM benötigt, aber so wie ich 
das verstehe würdest du auf dem MSP430 ja nur dekomprimieren.

Allerdings sehe ich es ähnlich wie meine Vorposter, ich würde versuchen 
den Code zu verkleinern und/oder mehr (externen) Speicher einsetzen. 
Würdest du die Daten aus einem externen EEPROM laden so hättest du ja 
dann noch mehr als genug Platz übrig für eventuelle zukünftige 
Erweiterungen.

Viele Grüße
Daniel

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Georg G. schrieb:
> Kai S. schrieb:
>> was spricht denn gegen einen klassischen Bootloader, der die Daten über
>> den Bus empfängt und direkt den Programmspeicher überschreibt?
>
> Er möchte überleben, auch wenn der Bootlader im letzten Rekord die
> Grätsche macht.

Kann ich zwar verstehen, aber der Preis wär mir dafür zu hoch. Die 
Hälfte des Flash dafür zu opfern, das bin ich nicht bereit 'zu 
bezahlen'. Dann schon lieber ein Neustart und ein neuer Versuch mit dem 
Bootloader.

Ob und wieviel eine Kompression an Platzgewinn bringt, das wird er 
ausprobieren müssen. Ich würde mir aber nicht allzuviel erwarten.

: Bearbeitet durch User
von DirkZ (Gast)


Lesenswert?


von Max G. (l0wside) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> Georg G. schrieb:
>> Er möchte überleben, auch wenn der Bootlader im letzten Rekord die
>> Grätsche macht.

Richtig. Außerdem ist die Kommunikation des Bootloaders ziemlich komplex 
und erfordert einen funktionierenden Stack. Wenn ich den Stack updaten 
will, habe ich ansonsten ein Henne-Ei-Problem.
>
> Kann ich zwar verstehen, aber der Preis wär mir dafür zu hoch. Die
> Hälfte des Flash dafür zu opfern, das bin ich nicht bereit 'zu
> bezahlen'. Dann schon lieber ein Neustart und ein neuer Versuch mit dem
> Bootloader.

Der Preisunterschied zwischen der 16k-Version und der 32k-Version sind 
20 Cent (100er-Stückzahlen). So what?

Ich muss mal ausprobieren gehen. Schade, hatte auf konkrete Erfahrungen 
(auch negative) gehofft.

Max

von Peter D. (peda)


Lesenswert?

Max G. schrieb:
> hatte auf konkrete Erfahrungen
> (auch negative) gehofft.

Wir benutzen AVRs, die haben eine Bootsektion. Da steht dann unser 
CAN-Bootloader.
Der Bootloader ist somit nach jedem Reset eine Zeit lang aktiv.
Damit ist auch bei einer korrupten Applikation immer eine 
Neuprogrammierung möglich.

Findet er eine gültige Applikation, startet er diese.
Ansonsten bleibt er im Bootloader und wartet auf Daten.
Ist die Applikation aktiv, kann sie jederzeit mit einem Watchdogreset 
den Bootloader starten.

von ha. (Gast)


Lesenswert?

Ich wuerd mir ein externes flash goennen. die gibt's auch im SO8 
Gehaeuse, sollte also nicht so platzintensiv sein.

von dj/+h (Gast)


Lesenswert?

Grundsätzlich sieht bei reinem Programmcode ja ziemlich mau aus was die 
Kompressionsraten angeht, aber rechne doch mal die Entrophie[1] deines 
Codes aus. Dann hätte man zumindest einen Anhaltspunkt wie gut sich das 
komprimieren lassen könnte.
Ansonsten könntest du spaßeshalber mal einige Packer vom C64 damals 
testen - die dürften ja von den constraints her in etwa passen (z.B. 
Pucrunch[2]).

[1] 
http://de.wikipedia.org/wiki/Entropie_(Informationstheorie)#Entropietests
[2] http://www.cs.tut.fi/~albert/Dev/pucrunch/

von Georg G. (df2au)


Lesenswert?

Max G. schrieb:
> Außerdem ist die Kommunikation des Bootloaders ziemlich komplex
> und erfordert einen funktionierenden Stack.

Naja... ein Bootlader, der per TFTP auf einem vorgegebenem Server bei 
jedem Start nach sieht, ob ein Update vorhanden ist, passt locker in den 
Bootbereich eines 644 (8kBytes). Und das dürfte das bequemste überhaupt 
sein.

von Stephan B. (matrixstorm)


Lesenswert?

Hallo.

Nehm einen Bootloader, der vor eigentlichem Firmwarestart irgend einen 
Redundanzcheck durchfuehrt (CRC, SHA* ...etc...).

Wenn aber dieser Check fehlschlaegt, oder explizit "Updatemodus" 
gestartet wurde (das kann ein bestimmer Wert im RAM nach reboot sein) - 
dann lauscht er auf dem BUS nach expliziten Updatebefehlen, um Seite 
fuer Seite zu "updaten" und auf einen "Restart" Befehl zu warteten.

Dadurch sparst du dir ein zusaetzliches Zwischenspeichern der Firmware 
und unnoetiges umkopieren. Wenn du Lust hast kannst du zusaetzlich 
Kompression verwenden - wieviel RAM steht dir denn zur Verfuegung?
GGf. kann man eine BWT (aehnlich wie in bzip verwendet) fuer jede Seite 
zur Kompression(svorbreitung) einbauen.
LZ (gzip oder lzma) scheint unpraktikabel, da du vermutlich nicht genug 
RAM fuer brauchbare Woerterbuchgroessen hast. Reine Eintropiekodierung 
dagen laesst sich in der Kompressionsstaerke uebertreffen.
Das decodieren einer BWT(S) ginge  in O(n) Speicher mittels 
Rosettavektoren - zwar sehr langsam (O(n^2)), aber ginge...

Gerne kann ich bzgl. Kompression aushelfen - bzgl. Update kannst du ja 
mal in den (AVR) Code des USBaspLoader testing branch sehen:
https://github.com/baerwolf/USBaspLoader/tree/testing

An einem komprimieren Updater-Image hatte ich auch schon mehrmals 
gedacht, bisher aber aus Zeitmangel immer wieder hinausgeschoben...

MfG

von dj/+h (Gast)


Lesenswert?

> GGf. kann man eine BWT (aehnlich wie in bzip verwendet) fuer jede Seite
> zur Kompression(svorbreitung) einbauen.
Für eine handvoll Kilobyte dürfte eine BWT aber vergebliche Liebesmühe 
sein. :(
Dann doch lieber ein LZ77 oder sowas.

von Stephan B. (matrixstorm)


Lesenswert?

dj/+h schrieb:
> Für eine handvoll Kilobyte dürfte eine BWT aber vergebliche Liebesmühe
> sein. :(
> Dann doch lieber ein LZ77 oder sowas.

Gerade deshlab BWT - LZ77 ist quatsch, da sich gar kein brauchbares 
Woerterbuch aufbaut.
Und BWT auf nur ein paar Kilobyte wird nicht schlechter sein, als pure 
Entropiekompression allein.

LZ77 laesst sich ggf. leicher decodieren.

MfG

: Bearbeitet durch User
von dj/+h (Gast)


Lesenswert?

Hum? Wenn ein LZ (77 oder SS oder wie die Varianten alle heissen) kein 
vernünftiges Wörterbuch aufbauen kann - wieso sollte dann die BWT groß 
was reissen können? Die basiert ja auch nur darauf das sich Sequenzen 
wiederholen. Hast du das mal konkret getestet? Erfahrungsgemäß kann man 
ja bei kleinen Blockgrößen nicht so viel reissen, als das es sich 
(meiner Ansicht nach) lohnen würde es zu implementieren.

von Stephan B. (matrixstorm)


Lesenswert?

Grossartig lohnen wird es sich nicht.

LZ77 wuerde vermutlich aehnlich gut abscheiden, wenn man die Suche 
perfekt macht. (Also alle moeglichen Laengen fuer alle moeglichen 
Matches probieren.
Das waere aber reduzierbar auf SetCover und somit sehr langsam.)
Ueblicherweise "schludert" man bei der Suche (Hashing, lazy coding ...), 
was gerade bei kleinen dictinaries boese auf die Kompressionsleistung 
geht.

Konkret muesste man testen.

MfG

von dj/+h (Gast)


Lesenswert?

> Konkret muesste man testen.
Das habe ich mir auch gerade gedacht. :)

Als Testfile diente mir die Firmware des C64 (Basic+Kernal; 
Maschinencode mit wenigen Strings, 8 KiB), die hatte ich gerade bei der 
Hand. Die Kompressoren für die BWT stammen von Marc Nelson[1]. Es wurden 
für verschiedene Blockgrößen jeweils zwei Tests ausgeführt: rle+bwt+ari 
und bwt+ari. Die Resultate (in Bytes):

Blockgröße 1 KiB: 15.051 und 15.057
Blockgröße 2 KiB: 14.973 und 14.977
Blockgröße 4 kiB: 14.929 und 14.934
Blockgröße 8 kiB: 14.908 und 14.912

Zum Vergleich: Die arithmetische Kompression alleine packte das File auf 
14.891 Bytes, der oben angesprochene Pucrunch auf 14.101. Es wurden bei 
keinem der Programme irgendwelche Switches zur Optimierung verwendet 
(allerdings ist der Pucrunch von Haus aus ja bereits auf solche 
Szenarien optimiert).
Bei diesen Zahlen scheint das Vorhaben des TEs (18kB Firmware auf 14kB 
zu packen) recht ambitioniert. Mit fertigen Pauschallösungen wird's 
schwierig, aber vielleicht könnte man einen Packer maßanfertigen. Wobei 
ich deinen Alternativvorschlag zum Update jedoch angebrachter finde...

[1] http://marknelson.us/1996/09/01/bwt/

von dj/+h (Gast)


Lesenswert?

dj/+h schrieb:
> Basic+Kernal; Maschinencode mit wenigen Strings, 8 KiB

Mist. Sind zusammen natürlich 16 KiB.

von Stephan B. (matrixstorm)


Lesenswert?

dj/+h schrieb:
> Basic+Kernal; Maschinencode mit wenigen Strings,

Kanst du das File bitte als Referenz hochladen.
Vielleicht teste ich nachher auch bissel rum (ich will es aber nicht 
versprechen), und so haben wir dann zumindest vergleichebare Ergebnisse.

MfG

von dj/+h (Gast)


Angehängte Dateien:

Lesenswert?

Und da ist es schon. Ist aber halt bloß ein willkürlich gewähltes File, 
besser wäre es freilich wenn der TE uns was zur Verfügung stellen 
könnte. Hoffentlich liest er uns noch zu...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Max G. schrieb:
> Welche Verfahren sind uC-tauglich?

Beitrag "[AVR ASM] Huffman (de)kompression"

von dj/+h (Gast)


Lesenswert?

Ich muss mich noch schnell korrigieren: Bei der BWT habe ich Döskopp den 
move to front vergessen, und beim PU habe ich übersehen, das der einen 
Entpacker gleich dazu linkt. Hier die korrigierten Werte.

rle+bwt+mtf+ari und bwt+mtf+ari (in Bytes)
Blockgröße 1 KiB: 13.973 und 13.906
Blockgröße 2 KiB: 13.848 und 13.784
Blockgröße 4 KiB: 13.778 und 13.719
Blockgröße 8 KiB: 13.716 und 13.661

Pucrunch, ohne Entpacker: 13.792

Sieht doch schon viel besser aus. :)

von Max G. (l0wside) Benutzerseite


Lesenswert?

Zwischenstand: Optimierung hat Reduktion auf 15kB gebracht. 7Zip dampft 
das auf 10kB ein, ist aber natürlich nicht uC-tauglich.

Mit einem angepassten Algorithmus könnten also so 12kB drin sein - das 
lässt auch noch etwas Raum für künftige Funktionalität. Den LZO schaue 
ich mir an - aber erst nächstes Jahr :-), jetzt gibt's Raclette.

Max

von Guest (Gast)


Lesenswert?

Völliger Schwachsinn. Das was du dir durch die Kompression am 
Update-Image sparst gibst du für den Code zur Dekompression gleich 
doppelt wieder aus. Zumal die Einsparung minimal sein wird.

Und wenn das Update jetzt ein bisschen größer wird? Kannst du es nicht 
ausliefern. Großartig.

Speicher dein Image doch in einen externen SPI Flash oder so, der ist 
billig, klein, und du hast die ganzen 32kByte Flash im MSP430 voll zur 
Verfügung.

von (prx) A. K. (prx)


Lesenswert?

Wenn schon Komprimierung, dann wäre es vielleicht ganz interessant, sich 
statt diverser LZ Verfahren erst einmal den Huffman anzuschauen. Da die 
MSP430 eine 16-Bit Codierung verwenden, könnte es sinnvoll sein, dabei 
nicht Bytes sondern die statistische Verteilung von Worten zu 
betrachten.

von (prx) A. K. (prx)


Lesenswert?

Guest schrieb:
> Völliger Schwachsinn. Das was du dir durch die Kompression am
> Update-Image sparst gibst du für den Code zur Dekompression gleich
> doppelt wieder aus.

Der Code macht keine Probleme. Verfahren wie LZRW sind sehr kompakt. Das 
Problem tabellengestützter Vefahren ist eher der RAM-Verbrauch. Denn die 
dynamischen Daten des Dekomprimierers müssen da rein. Da könnte der von 
Läubi und mir erwähnte Huffman interessanter sein.

: Bearbeitet durch User
von Ulrich (Gast)


Lesenswert?

Der Code zur Decomprimierung muss nicht besonders groß sein - auch muss 
man den nicht unbedingt in dem Teil haben der Aktualisiert wird. Es kann 
ggf. auch ein kleiner Teil fest bleiben. Der Huffman Code (ASM) aus dem 
Link oben sollte so etwa 150-200 Worte lang sein, die Umsetzung auf den 
MSP430 ist ggf. etwas länger. Das ist nicht wirklich viel.

Wie viel die Komprimierung bringt kann man vorher am PC probieren. Auch 
wenn es nur 10 % sind würde es da schon lohnen.

Eine Alternative wäre es ggf. noch als Zwischenlösung eine 
Eingeschränkte Version der SW zu laden, und so Speicher zu sparen: also 
vom alten Code auf einen Minimalversion und erst dann auf die neue volle 
Version. Die Minimalversion muss man in der Regel ja nicht 
aktualisieren, wenn man sie einmal hat - im Extremfall kann sie zu einem 
Bootloader werden, der nur das Update unterstützt. Die Möglichkeit hat 
man auch später noch - falls es wirklich nicht mehr reicht.

von Guest (Gast)


Lesenswert?

Ulrich schrieb:
> Der Code zur Decomprimierung muss nicht besonders groß sein - auch muss
> man den nicht unbedingt in dem Teil haben der Aktualisiert wird. Es kann
> ggf. auch ein kleiner Teil fest bleiben. Der Huffman Code (ASM) aus dem
> Link oben sollte so etwa 150-200 Worte lang sein, die Umsetzung auf den
> MSP430 ist ggf. etwas länger. Das ist nicht wirklich viel.
>
> Wie viel die Komprimierung bringt kann man vorher am PC probieren. Auch
> wenn es nur 10 % sind würde es da schon lohnen.
>
> Eine Alternative wäre es ggf. noch als Zwischenlösung eine
> Eingeschränkte Version der SW zu laden, und so Speicher zu sparen: also
> vom alten Code auf einen Minimalversion und erst dann auf die neue volle
> Version. Die Minimalversion muss man in der Regel ja nicht
> aktualisieren, wenn man sie einmal hat - im Extremfall kann sie zu einem
> Bootloader werden, der nur das Update unterstützt. Die Möglichkeit hat
> man auch später noch - falls es wirklich nicht mehr reicht.

Viel mehr als 10% wird man aber vermutlich auch nicht rausholen können. 
Wenn 7z schon nur 30% bringt...
Auch die Geschichte mit dem Minimal-Loader, klar funktioniert das, aber 
das ist doch lächerlich...
Was für eine Anwendung braucht denn bitte einen so komplexen 
Protokollstack, dass er nicht in den Bootloader passt, bzw dass der 
Bootloader zu unflexibel dazu ist, andererseits aber kein Platz/Geld für 
einen externen Flash da ist?

von Frank K. (fchk)


Lesenswert?

Guest schrieb:

> Bootloader zu unflexibel dazu ist, andererseits aber kein Platz/Geld für
> einen externen Flash da ist?

Wobei ich dafür kein Flash, sondern ein SRAM wie zB 23K256 (32k SPI) 
nehmen würde.

fchk

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

A. K. schrieb:
> Der Code macht keine Probleme. Verfahren wie LZRW sind sehr kompakt. Das
> Problem tabellengestützter Vefahren ist eher der RAM-Verbrauch. Denn die
> dynamischen Daten des Dekomprimierers müssen da rein. Da könnte der von
> Läubi und mir erwähnte Huffman interessanter sein.


Der Huffmancode kommt prinzipiell mit nur einem Wort Speicher aus, so 
wahnsinnig viel Flash wurde auch nicht verbraucht wenn ich mich recht 
erinnere. Da der Huffmancode zudem noch ein "optimaler" ist...

A. K. schrieb:
> Da die MSP430 eine 16-Bit Codierung verwenden, könnte es sinnvoll sein,
> dabei nicht Bytes sondern die statistische Verteilung von Worten zu
> betrachten

Das kommt auf die Daten an, ich habe bei meinem Versuch auch einen 
4bit-Modus eingebaut, da dieser bei einigen Daten noch bessere 
Ergebnisse gebracht hat. Bei 16bit ist noch das Problem, dass die 
Mappingtabelle nämlich ggf. größer als die tatsächlichen Daten werden 
könnte...

Man könnte sich sogar theoretisch die Tabelle in den Daten sparen wenn 
man von einem festem Baum ausgeht, aber das bringt dann wirklich nur 
noch wenig.

Ulrich schrieb:
> er Huffman Code (ASM) aus dem Link oben sollte so etwa 150-200 Worte
> lang sein, die Umsetzung auf den MSP430 ist ggf. etwas länger.

Das kommt drauf an, der AVR hat nicht so viele tolle Bitschiebebefehle 
die man aber für Huffman benötigt (Bitstrom zu Symbolstrom), da könnte 
der MSP im Vorteil sein auch mit seiner 16bit Architektur ist eventuell 
noch etwas rauszuholen.

: Bearbeitet durch User
von Max G. (l0wside) Benutzerseite


Lesenswert?

Frohes neues Jahr an alle!

Ich habe mal ein bisschen rumgespielt.
Binäre Referenzdatei (bis auf ein paar Bytes identisch zum späteren 
Speicherinhalt): 14.866 Bytes
Huffmann-Encoding (von 
http://folk.uio.no/thomanyg/inf1040/huffman/index_en.html ): Codebook 
3.070 Bytes, Output 103.440 Bytes - allerdings ASCII, nicht binär. Binär 
kämen wohl rund 13.500 Bytes raus - keine Sensation.
LZO2A-999 (Oberhumer): 11.031 Bytes. Ich werde aber noch nicht mal aus 
der Programmstruktur, geschweige denn dem Code schlau.
PUC: 10.708 Bytes - allerdings werde ich auch hier nicht schlau.
GZIP (LZ77) mit Option -1: 10.609 Bytes
Aus der Basic Compression Library ( http://bcl.comli.eu/download-en.html 
):
 RLE: keine Kompression
 Shannon-Fano: 13.485 Bytes
 Huffmann: 13.287 Bytes (müsste theoretisch identisch sein zu der 
norwegischen Implementierung - naja, sei´s drum).
 Lempel-Ziv: 12.770 Bytes
Sequentiell (erst LZ77, dann Huffman): 11.518 Bytes

Ich muss mal einen näheren Blick auf LZ werfen. Die 
Referenzimplementierung für die Dekompression hat rund 25 
Codezeilen...das klingt vertretbar :-)
Wenn das läuft, kann noch der Huffman dazu. Das nähert sich dann schon 
langsam der Redundanzfreiheit.

So weit zum Thema "völliger Unfug"...

Max

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Läubi .. schrieb:

> Man könnte sich sogar theoretisch die Tabelle in den Daten sparen wenn
> man von einem festem Baum ausgeht, aber das bringt dann wirklich nur
> noch wenig.

Nein, ganz im Gegenteil. Das ist der zielführendste Ansatz, jedenfalls 
unter der Prämisse, daß die Idee mit dem Entropieencoder an sich 
überhaupt sinnvoll ist.

Ein fester Baum spart doppelt Platz, zum einen brauchen keine 
Informationen zur dynamischen Anpassung des Baums übertragen und im Ziel 
gespeichert zu werden, zum anderen braucht's keinen Code, der diese 
Anpassungen dann beim Auspacken erledigt.

Und das Erstellen des optimalen Baums ist ja unkritisch, denn das 
passiert auf dem PC, wo genug Rechenleistung und RAM verfügbar ist, um 
für die relativ geringe Datenmenge so einer Firmware auch noch die 
optimale Codewortgröße zu suchen, zumal viele Eigenschaften der Daten 
zuvor bereits bestens bekannt sind. Man weiß ja, wie Instruktionen 
aufgebaut sind, man weiß, wo im Code Strings und Sprungtabellen liegen 
usw. usf.

> Das kommt drauf an, der AVR hat nicht so viele tolle Bitschiebebefehle
> die man aber für Huffman benötigt (Bitstrom zu Symbolstrom) da könnte
> der MSP im Vorteil sein auch mit seiner 16bit Architektur ist eventuell
> noch etwas rauszuholen.

Die Megas haben einen Hardware-Multiplizierer. Der eignet sich auch ganz 
hervorragend zum Bitschieben. In zwei Takten ist jede beliebige 
Verschiebung von 8 Bits erledigt und die werden dabei auch gleich noch 
in zwei mundgerechte Häppchen zerlegt.

Ich sehe nicht, wo da beim MSP eine höhere Effizienz herkommen sollte. 
Die größere Verarbeitungsbreite nützt bei einem Bitstreamdecoder (wie 
auch sonst sehr oft) leider rein garnichts.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Max G. schrieb:
> Sequentiell (erst LZ77, dann Huffman)

Das mag (manchmal) was bringen, idr ist es aber Unsinn zweimal zu 
komprimieren.

Wenn sich die Daten schlecht komprimieren lassen kann das auch einfach 
bedeuten, dass wenig Redundanz vorhanden ist, oder du nahe an der 
Gleichverteilung für die Symbole bist. Das wiederum hängt von deinem 
Code ab, probiere es doch mal mit meinem Kompressor im 4 bit Modus oder 
stell das Binärfile mal Online.

Max G. schrieb:
> RLE: keine Kompression

RLE eigent sich nur für einen Datenstrom welcher viele gleich 
aufeinanderfolgende Daten enthält (z.B. Bilder, Messwerte) für ein 
Programm sollte das (hoffentlich) kaum zutreffen.

c-hater schrieb:
> Das ist der zielführendste Ansatz

Unter der Annahme das seine Quellcodes immer ähnlich sind...

c-hater schrieb:
> Ein fester Baum spart doppelt Platz, zum einen brauchen keine
> Informationen zur dynamischen Anpassung des Baums übertragen und im Ziel
> gespeichert zu werden, zum anderen braucht's keinen Code, der diese
> Anpassungen dann beim Auspacken erledigt.

Äh... der Baum muss doch immer vorhanden und abgearbeitet werden, ob der 
nun "statisch" vorliegt oder in den Daten eingebettet bringt nur was bei 
wiederholter Übertragung, bedingt aber auch einen nicht ganz so 
optimalen Code.

c-hater schrieb:
> Ich sehe nicht, wo da beim MSP eine höhere Effizienz herkommen sollte.
> Die größere Verarbeitungsbreite nützt bei einem Bitstreamdecoder (wie
> auch sonst sehr oft) leider rein garnichts.

Ich habe nur anmerken wollen das das sicher nicht langsamer ist, z.B. 
kannst du auf einem MSP 16bit in ein Arbeitsregister laden und 
"durchschieben", beim 8bit musst du für die gleiche Menge zwei 
Datenworte laden.

: Bearbeitet durch User
von DirkZ (Gast)


Lesenswert?

Läubi .. schrieb:
> Max G. schrieb:
>> Sequentiell (erst LZ77, dann Huffman)
>
> Das mag (manchmal) was bringen, idr ist es aber Unsinn zweimal zu
> komprimieren.

gzip verwendet LZ77 und Huffman.

von (prx) A. K. (prx)


Lesenswert?

Läubi .. schrieb:
> Das mag (manchmal) was bringen, idr ist es aber Unsinn zweimal zu
> komprimieren.

Erst LZ und dann H ist ziemlich verbreitet, wenn es eher um Rate als 
Zeit geht.

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Läubi .. schrieb:
> Max G. schrieb:
>> Sequentiell (erst LZ77, dann Huffman)
>
> Das mag (manchmal) was bringen, idr ist es aber Unsinn zweimal zu
> komprimieren.

Das ist nun in dieser Allgemeinheit wiederum Unsinn.

Die meisten Kompressionsprogramme kombinieren mehrere Kompressions- 
verfahren und erreichen erst so eine gute Kompressionsrate. In der 
Experimentierphase, wo man das beste Verfahren für sein Quellmaterial 
sucht, ist es hingegen höchst sinnvoll, Programme zu verwenden die 
jeweils nur ein Verfahren implementieren und diese dann zu kombinieren.

Die letzte Stufe ist dabei meist eine generische Entropieminimierung 
(Huffman, arithmetische Codierung etc) während die vorgeschalteten 
Stufen an die Eigenheites des Quellmaterials angepaßt werden. Z.B. ist 
BWT + MTF (bzip2) typisch gut für Text und weniger gut für Binärcode. 
RLE bringt nur bei entsprechend ineffizient codierten Daten was (z.B. 
Bitmaps für GUI-Elemente). LZ wiederum ist ein guter 
Allzweckalgorithmus. Wavelets, DCT usw. spielen ihre Stärken dann bei 
bandbreitenbegrenzten Daten aus. Oder in Kombination mit einer bewußt 
verlustbehafteten Bandbreitenminderung.

Für Binärcode würde ich darauf tippen, daß LZ + Entropie die besten 
Ergebnisse bringt. Mit geringen Abhängigkeiten von der Parametrierung.

Allerdings glaube ich auch, daß bei diesen geringen Datenmengen der 
mögliche Gewinn durch die Komprimierung fast sicher wieder durch den 
Code für den Decompressor aufgefressen wird.


XL

von Max G. (l0wside) Benutzerseite


Lesenswert?

Aktueller Stand: Einfachimplementierung mit LZ77 komprimiert schon, 
Dekomprimierung muss ich noch auf die Applikation anpassen.

Ergebnis: Größenreduktion von 19.456 Bytes (Vergrößerung wegen Anpassung 
auf Flash-Segmentgrenzen) auf 14.336 Bytes. Macht eingesparte 5 kB.

Der Dekompressionscode braucht aktuell 178 Bytes. Wird durch die 
Anpassung noch ein bisschen mehr werden, vielleicht 500 Byte.

Ich bin schon ganz zufrieden :-)

Max

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Warum kommt mir bei diesem Ansatz nur der Spruch: "Warum bequem, wenn's 
auch umständlich geht", durch den Kopf?

Wurde das Bootloader-Konzept nicht aufgestellt, um genau diesen 
Doppelwopper zu vermeiden?

Normalerweise wird beim Rechnerstart, mit ein paar Tricks, ein neues 
Programm geladen. Modifiziere doch einfach den Bootloader so, dass er 
von sich aus aktiv werden kann, nachschaut ob was anliegt und von sich 
aus eine Umprogrammierung vornimmt. Das kostet zwar auch ein paar Bytes, 
aber nicht das volle Programm.

Freie Bootloader gibt's mittlerweile wie Sand am Meer. Auch gut 
dokumentierte. Modifiziere doch einfach einen von diesen. Und frage den 
Verfasser ob es ihn stört.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.