Quais são as implicações do uso do PROGMEM?

12

Com grandes quantidades de variáveis ​​de texto, achei necessário armazená-las na memória Flash usando PROGMEM . Quais são as consequências positivas e negativas do armazenamento de grandes variáveis ​​no Flash (usando PROGMEM) vs SRAM vs EEPROM no Arduino?


fonte

Respostas:

10

Aqui está uma rápida comparação do FLASH, EEPROM e SRAM no AtMega328, o microcontrolador em muitas das placas Arduino atuais (excluindo Due, Leonardo, Arduinos mais antigos e algumas outras placas compatíveis).

  • FLASH: 10.000 ciclos de gravação / apagamento. O acesso é rápido, mas mais lento que o SRAM. O código acessa via PROGMEM.
  • EEPROM: 100.000 ciclos de gravação / exclusão. O acesso é lento, em milissegundos. Procedimento de acesso relativamente complexo.
  • SRAM: Ciclos ilimitados de gravação / apagamento. O acesso é muito rápido, 2 ciclos de relógio. Acesso direto por código.

Portanto, a principal consequência negativa hipotética do uso de PROGMEM é o limite do ciclo de 10.000 gravações . A principal consequência negativa do uso da EEPROM é a complexidade do código para ler / gravar / copiar dados. SRAM, é apenas uma capacidade muito limitada .

Anindo Ghosh
fonte
Onde você está obtendo as informações sobre o acesso à EEPROM? De um pouco de procura sobre , parece que EEPROM take algo como ciclos de ~ 5 relógio. A escrita é lenta, mas não a leitura.
Connor Wolf
O OP quer armazenar muitas coisas.
Anindo Ghosh
Sim, mas isso é escrever uma vez, ler muitos, ou o inverso? "Variáveis ​​de texto" são provavelmente algo que é especificado em tempo de compilação, gravado no dispositivo e nunca alterado depois disso (por exemplo, texto do menu ou sommat).
Connor Wolf
Eu li a loja na pergunta como "loja no momento da compilação / upload". Se uma variável é utilizada para leitura / gravação em tempo de execução, ela definitivamente não deve ser armazenada no FLASH. Não existe a restrição adicional de que o FLASH não pode ser modificado sem apagar a página inteira primeiro?
microtherion
... variáveis ​​de texto não constantes de string.
Anindo Ghosh
2

A implicação principal é que você não pode modificar as informações armazenadas no PROGMEM. Você também receberá um desempenho (muito pequeno), pois a cadeia precisa ser copiada 1 byte de cada vez.

O desgaste do FLASH não é uma preocupação (principal), pois para fazer alterações no seu programa você teria que reprogramar o FLASH de qualquer maneira.

Com a introdução do IDE 1.x, a macro F () foi incluída. Isso facilita manter as strings no PROGMEM.

Por exemplo, em vez de usar: Serial.print ("Hello World!");

Agora você pode usar:

Serial.print (F ("Olá, mundo!");

Observe que F () não é uma função, é apenas uma macro, portanto seu uso é um pouco limitado.

baldengineer
fonte
1

O PROGMEM é melhor usado para dados imutáveis. Se você vai continuar mudando rapidamente as variáveis, eu apenas as armazeno na SRAM. Por outro lado, se você quiser ter algumas variáveis ​​de texto imutáveis ​​(por exemplo, itens a serem exibidos) que não serão buscadas com muita frequência, PROGMEM é uma ótima idéia.

Em relação à EEPROM - tente salvar isso para coisas persistentes. No IIRC, é mais lento buscar dados da EEPROM sobre SRAM / PROGMEM. Geralmente eu (e outros) copiamos dados da EEPROM para a SRAM (até o exemplo oficial faz isso) antes de usá-los.

Manishearth
fonte