algorithm - prometec - guardar texto en eeprom arduino
Arduino: Algoritmo de compresiĆ³n ligero para almacenar datos en EEPROM (8)
Quiero almacenar una gran cantidad de datos en mi Arduino con un microcontrolador ATmega168 / ATmega328 , pero desafortunadamente solo hay 256 KB / 512 KB de almacenamiento EEPROM.
Mi idea es hacer uso de un algoritmo de compresión para reducir el tamaño. Pero bueno, mi conocimiento sobre algoritmos de compresión es bastante bajo y mi búsqueda de bibliotecas listas para usar falló.
Entonces, ¿hay una buena manera de optimizar el tamaño de almacenamiento?
¿Una EEPROM externa (por ejemplo, a través de I2C) no es una opción? Incluso si utiliza un algoritmo de compresión, el lado negativo es que el tamaño de los datos que puede almacenar en la EEPROM interna ya no puede determinarse de manera sencilla. para el SPI ... Hay algunos sistemas de archivos compatibles con FAT de código abierto de peso ligero en la red.
El método descrito en el artículo "Algoritmos de compresión de datos para dispositivos con limitaciones de energía en redes tolerantes al retardo" podría ejecutarse en un ATmega328 .
Referencia: C. Sadler y M. Martonosi, “Algoritmos de compresión de datos para dispositivos con limitaciones de energía en redes tolerantes al retraso”, Actas de la Conferencia ACM sobre sistemas de sensores integrados en red (SenSys) 2006, noviembre de 2006. .pdf. Fuente S-LZW para MSPGCC: slzw.tar.gz. Actualizado el 10 de marzo de 2007.
Los AVR solo tienen unos pocos kilobytes de EEPROM, y muy pocos tienen muchos más de 64K Flash (no los Arduinos estándar).
Si necesita almacenar algo y rara vez se modifica, por ejemplo, una imagen, puede intentar usar el Flash ya que hay mucho más espacio para trabajar. Para imágenes simples, alguna codificación RLE en bruto podría ser de gran ayuda.
La compresión de algo más aleatorio, por ejemplo, los datos registrados, el audio, etc., supondrá una gran cantidad de sobrecarga para el AVR, tendrá más suerte al obtener un chip EEPROM de serie para almacenar estos datos. El sitio de Arduino tiene una página sobre la interfaz con un chip de 64K , que suena. Si quieres más que eso, observa la interfaz con una tarjeta SD con SPI, por ejemplo, en este escudo de audio.
Puede echar un vistazo al algoritmo LZO , que está diseñado para ser ligero. No sé si hay implementaciones para el sistema AVR, pero podría ser algo que podría implementar usted mismo.
Sin embargo, puede que esté algo mal informado acerca de la cantidad de almacenamiento disponible en EEPROM en su chip; De acuerdo a la ficha técnica tengo los tamaños de EEPROM que son:
ATmega48P: 256
ATmega88P: 512
ATmega168P: 512
ATmega256P: 1024
Tenga en cuenta que esos valores están en bytes , no en KB como menciona en su pregunta. Esto no es, de ninguna manera, una "carga de mierda".
Si solo desea eliminar algunos cero repetidos o similares, utilice la codificación de longitud de ejecución. Las secuencias de bytes repetidas se almacenarán como:
<mark><byte><count>
Es un algoritmo súper simple, que probablemente puedas codificar en pocas líneas de código.
Un algoritmo parecido a LZSS probablemente sería una buena opción para una plataforma integrada. Son algoritmos simples, y no necesitan mucha memoria.
LZS es uno con el que estoy familiarizado. Utiliza un diccionario de 2 kB para la compresión y descompresión (el diccionario es el más reciente de 2 kB de la secuencia de datos sin comprimir). ( LZS fue patentado por HiFn , sin embargo, por lo que puedo decir, todas las patentes han caducado).
Pero veo que un ATmega328 , usado en Arduinos recientes, solo tiene 512 bytes a 2 kB SRAM, por lo que tal vez incluso LZS es demasiado grande para eso. Estoy seguro de que podrías usar una variante con un diccionario más pequeño, pero no estoy seguro de qué relaciones de compresión alcanzarías.
Un estudio de la NASA aquí (PostScript)
Un repost del artículo de 1989 en LZW aquí
Manténgalo simple y realice un análisis del costo / pago de agregar compresión. Esto incluye tiempo y esfuerzo, complejidad, uso de recursos, compresibilidad de datos, etc.