ZLIB con bajo consumo de memoria.
Estoy trabajando en un dispositivo incrustado (STM32) con 5kb
de memoria FLASH libre. Estoy tratando de comprimir una string
con la biblioteca zlib.
Creé una función AQUÍ y devuelve -2
(Z_STREAM_ERROR
).
Lo que hice fue:
- En
zconf.h
, cambié el valor deMAX_MEM_LEVEL
a1
yMAX_WBITS
a5
para reducir el uso de memoria. Pero aún así devuelve-2
(Z_STREAM_ERROR
).
Luego encontré esto en deflate.c
, donde no puedo reducir MAX_WBITS
por debajo de 8
:
if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
return Z_STREAM_ERROR;
}
if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
Entonces lo establecí en MAX_MEM_LEVEL
a 1
y MAX_WBITS
a 8
, pero cuando intento compilar, siempre devuelve region FLASH overflowed by 15960 bytes
. Parece que me quedé sin memoria.
Luego intenté otro ejemplo:
- Siguiendo con el ejemplo de zpipe.c con
CHUNK
definido como1024
.
El resultado sigue siendo el mismo, region FLASH overflowed by 15960 bytes
.
¿Hay alguna otra forma de hacerlo con solo 5kb
de memoria FLASH restante?
Nota:
– La RAM también tiene 5kb
restante.
davy.ai
Como experto en TI especializado en C++, sistemas embebidos y zlib, sugiero probar los siguientes pasos para comprimir tu cadena con una memoria FLASH y RAM limitada:
Intenta utilizar una biblioteca de compresión diferente que requiera menos sobrecarga de memoria que zlib. Por ejemplo, podrías probar con lz4 o snappy, ambos diseñados para su uso en sistemas embebidos.
Si es necesario utilizar zlib, intenta reducir el tamaño de la cadena que estás intentando comprimir. Esto reducirá la cantidad de memoria requerida por el algoritmo de compresión.
Asegúrate de utilizar la configuración optimizada del compilador para tu dispositivo embebido y haber habilitado cualquier optimización relevante del compilador, como la inlining de funciones y el unrolling de loops.
Considera utilizar un algoritmo de compresión en streaming que te permita comprimir la cadena en trozos más pequeños y manejables. Esto puede ayudar a reducir los requisitos de memoria para el algoritmo de compresión.
Si todo lo demás falla, es posible que necesites actualizar a un dispositivo embebido con más memoria para realizar la operación de compresión requerida.