Posso gravar na memória Flash usando PROGMEM?

11

Na documentação do Arduino, cito:

http://playground.arduino.cc/Learning/Memory Nota: a memória Flash (PROGMEM) pode ser preenchida apenas no tempo de gravação do programa. Você não pode alterar os valores no flash após o início do programa.

E na descrição do PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Armazene dados na memória flash (programa) em vez da SRAM. Há uma descrição dos vários tipos de memória disponíveis em uma placa Arduino.

A palavra-chave PROGMEM é um modificador de variável, deve ser usada apenas com os tipos de dados definidos em pgmspace.h. Diz ao compilador "coloque essas informações na memória flash", em vez de na SRAM, para onde normalmente iria.

Então nós podemos ou não podemos? Ou não é a mesma coisa?

zzarbi
fonte
Enquanto você pode gravar na memória do programa (flash) em tempo de execução (a menos que esteja bloqueado), o processo é um pouco mais complicado e não pode ser realizado com a diretiva PROGMEM, que basicamente controla o processo de alocação. Se você quiser ver como isso pode ser feito, consulte a fonte do carregador de inicialização.
Chris Stratton
Os blocos de gravação de página não tornam a gravação em flash impraticável. Na verdade, é algo que esperamos ansiosamente.
Anothercg Gmail 7/10/19

Respostas:

9

A resposta curta é não: os dados do PROGMEM são somente leitura.

Limitações da memória flash
A primeira coisa a entender é que a memória Flash (onde fica o espaço do programa) foi projetada para armazenamento fixo a longo prazo. A leitura é muito rápida e precisa. No entanto, de um modo geral, você não pode modificá-lo byte a byte (por exemplo, alterando uma variável específica). Você geralmente precisa apagar e reescrevê-lo em grandes blocos. Isso torna completamente impraticável a manipulação em tempo de execução, porque você teria que armazenar muitas informações redundantes em outro lugar enquanto realiza o ciclo de apagar e gravar.

O que o PROGMEM realmente faz
Quaisquer dados literais especificados no seu código (como seqüências de caracteres e números) sempre residem no espaço do programa primeiro (por exemplo, no Flash). No entanto, quando seu esboço realmente deseja usar esses dados em tempo de execução, normalmente ele precisa alocar algum espaço para eles na SRAM e copiá-los. Isso significa que você acaba com duas cópias: o original fixo no Flash e a cópia temporária na SRAM.

Quando você usa o modificador PROGMEM, está dizendo para não fazer essa segunda cópia na SRAM. Em vez disso, seu rascunho simplesmente acessará o original no Flash. Isso é muito útil se você precisar apenas ler os dados, pois evita as operações de alocação e cópia.

No entanto, copiá-lo para SRAM é essencial se você deseja modificar os dados. Além das limitações do Flash que mencionei acima, também é uma questão de segurança do código.

Se você conseguir modificar os dados armazenados no espaço do programa, é lógico que você também pode modificar o código armazenado no espaço do programa. Isso significaria que um simples erro (ou, em teoria, um ataque malicioso) poderia resultar na reescrita parcial ou total do esboço em tempo de execução. Isso pode ter resultados muito imprevisíveis, variando de simplesmente parar de trabalhar, até danificar / destruir qualquer equipamento conectado.

Mais informações
Você pode aprender mais sobre as coisas de baixo nível do PROGMEM aqui:

Uma versão mais antiga do mesmo tutorial PROGMEM está disponível aqui:

Peter Bloomfield
fonte