Pergunta

Eu quero armazenar uma grande quantidade de dados para o meu Arduino com um ATmega168 / ATmega328 microcontrolador, mas, infelizmente, há apenas 256 KB / 512 KB de armazenamento EEPROM.

A minha ideia é fazer uso de um algoritmo de compressão de tirar a roupa do tamanho. Mas bem, meu conhecimento sobre algoritmos de compressão é muito baixa e minha busca por bibliotecas ready-to-use falhou.

Assim, há uma boa maneira de otimizar o espaço de armazenamento?

Foi útil?

Solução

Você pode ter um olhar para o LZO algoritmo, que é projetado para ser leve. Eu não sei se existem implementações para o sistema AVR, mas pode ser algo que você pode implementar-se.

Você pode ser um pouco mal informado sobre a quantidade de armazenamento disponível em EEPROM no seu chip embora; de acordo com a folha de dados Eu tenho os tamanhos EEPROM são:

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

Note que esses valores estão em bytes , não KB como você menciona na sua pergunta. Este não é, por qualquer medida, uma "porrada".

Outras dicas

AVRs têm apenas alguns kilobytes de EEPROM, no máximo, e muito poucos têm muitos mais do que 64K de flash (não Arduinos padrão fazer).

Se você está precisando para armazenar alguma coisa e raramente modificar, por exemplo, uma imagem, você pode tentar usar o Flash como há muito mais espaço lá para trabalhar. Para imagens simples, alguns codificação RLE bruto que percorrer um longo caminho.

A compactação nada mais aleatório, por exemplo logado dados, áudio, etc, terá uma enorme quantidade de sobrecarga para o AVR, você terá melhor sorte para conseguir um chip EEPROM de série para manter esses dados. o site do Arduino tem uma página em interface com um 64K chip, que sons. Se você quer mais do que isso, olhar para a interface com um cartão SD com SPI, por exemplo, em este escudo áudio

Um estudo da NASA aqui (Postscript)

A repost de 1989 artigo sobre LZW aqui

Mantenha-o simples e realizar a análise do custo / payout de adicionar compressão. Isso inclui o tempo e esforço, a complexidade, o uso de recursos, compressão de dados, etc.

Um algoritmo algo como LZSS provavelmente seria uma boa escolha para uma plataforma embarcada. Eles são algoritmos simples e não precisa de muita memória.

LZS é um que eu estou familiarizado com. Ele usa a 2 kB dicionário para compressão e descompressão (o dicionário é a maioria dos últimos 2 kB do fluxo de dados sem compressão). ( LZS foi patenteada por hlFN , no entanto, tanto quanto eu posso dizer, todas as patentes já expiraram.)

Mas eu vejo que um ATmega328 , usado em recentes Arduinos , tem apenas 512 bytes a 2 kB SRAM, talvez por isso mesmo LZS é grande demais para ele. Tenho certeza que você poderia usar uma variante com um dicionário menor, mas eu não tenho certeza do que taxas de compressão que você conseguir.

O método descrito no documento “Data Compression Algoritmos para a energia com restrições Devices em Delay Tolerant Networks” pode ser executado em um ATmega328 .

Referência: C. Sadler e M. Martonosi, “Data Compression Algoritmos para a energia com restrições Devices em Delay Tolerant Networks”, Anais da Conferência ACM sobre embarcados em rede dos sistemas de sensor (sensys) de 2006, Novembro de 2006. .pdf. S-LZW Fonte para MSPGCC: slzw.tar.gz. Atualizado 10 de março de 2007.

Você também pode querer dar uma olhada em lzjb , sendo muito curto, simples e leve.

Além disso, FastLZ pode valer a pena um olhar. Ele obtém melhores taxas de compressão de lzjb e tem requisitos de memória muito mínimas para descompressão:

Se você quiser apenas para remover algumas repetindo Zero ou tal, use Run-length encoding Repetindo seqüências de bytes serão armazenados como:

<mark><byte><count>

É algoritmo de super-simples, que você pode provavelmente código-se em poucas linhas de código.

É uma EEPROM externa (por exemplo, através de I2C) não é uma opção? Mesmo se você usar um algoritmo de compressão lado negativo é que o tamanho dos dados que você pode armazenar na EEPROM interna não pode ser determinada de uma forma simples mais .. E de corse, se você realmente Kbytes médios, então considerar um SDCard ligado ao SPI ... Existem alguns sistemas de arquivos luz ponderada de código aberto FAT-compatível na rede.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top