Resim nahravani FW do jednoho pristroje. Nejhorsi je prave ten prenos dat. Proto uvazuji ze bych to necim zabalil a pak poslal. Resim tedy jaky kompresni algoritmus abych to mohl naimplementovat. Na strane PC (ten to posila) nemam zadne omezeni. V tom pristroji ale potrebuji lehky dekompresor co spotrebovava malo RAM.
Dik za radu
Nepíšete, jaký kompresní poměr potřebujete, ale zkuste třeba https://github.com/xbarin02/x-compressor. Zdrojové kódy jsou krátké a přehledné. Paměť prakticky nepotřebuje (jen pár tabulek o velikosti 256 položek).
Narazil jsem na LZF a to mi na to přišlo skvělé. Komprese jen buď kopíruje data ze vstupu do výstupu nebo referencuje už dříve dekomprimovaná data a tak nepoužívá žádnou vlastní paměť.
http://oldhome.schmorp.de/marc/liblzf.html
https://github.com/nemequ/liblzf (git mirror)
Používal jsem to pro obrázky místo QOI qoiformat.org . Ta byla taky dost slibná, ale umí komprimovat jen RGB888 a RGBA8888 obrázky a dost špatně komprimuje změnu na alpha kanálu. Na Cortex-M4 kde jsem to použil byl LZF zhruba 2x pomalejší, ale komprimoval lépe a mohl jsem s tím komprimovat i jiné věci.
V lzf_d.c je dekompresor ale ten kód je trochu humus. Trochu osekaná a pročištěná verze:
#include <stddef.h>
#include <stdint.h>
size_t lzf_decompress(uint8_t *out, size_t out_len, const uint8_t *in, size_t in_len)
{
const uint8_t *ip = in;
uint8_t *op = out;
while (ip < in + in_len) {
uint8_t ctrl = *ip++;
if (ctrl < (1 << 5)) {
/* literal run */
uint32_t len = ctrl + 1;
while (len--) {
*op++ = *ip++;
}
} else {
/* back reference */
uint32_t len = ctrl >> 5;
if (len == 7) {
len += *ip++;
}
len += 2;
uint8_t *ref = op - ((ctrl & 0x1f) << 8) - 1;
ref -= *ip++;
while (len--) {
*op++ = *ref++;
}
}
}
return op - out;
}
A ta velikost sedi?
Mozna bych se zameril spis na diferencialni update - pokud v zarizeni je znamej FW, tak ho lze pouzit jako "slovnik", resp. prenest jen upravene data. Samozrejme pak do toho pristupu muzou hazet vidle ruzne jiz predkompresovane struktury (a la squashfs), takze muze byt nutne trocha zmenit strukturu, aby takova rozdilova aktualizace byla efektivni.