Questão:
Quando usar o PROGMEM?
Praveen Singh Yadav
2018-05-10 14:29:56 UTC
view on stackexchange narkive permalink

Eu acredito que o PROGMEM é usado para armazenar grandes dados (por exemplo, strings) que não mudam. Portanto, ele libera a SRAM.

na Referência Ardunio é mencionado que.

"Usar o PROGMEM também é um procedimento de duas etapas. Depois de colocar os dados na memória Flash, requer métodos especiais (funções), também definidos na biblioteca pgmspace.h, para ler os dados da memória do programa de volta para a SRAM, para que possamos fazer algo útil com eles. "

Se eu tiver que carregar o dados em SRAM antes de usá-los, então como é eficiente do que diretamente stroing em SRAM definindo normalmente vaiable

... Porque não * fica * na SRAM ...
Trzy respostas:
Majenko
2018-05-10 14:42:57 UTC
view on stackexchange narkive permalink

Digamos que você tenha uma string de 1000 caracteres em Flash e queira imprimi-la em Serial. Sim, você precisa carregá-lo na RAM para passar esses dados pelo local para impressão. Mas, você precisa colocar tudo na RAM de uma vez? Não. Você só precisa de um personagem por vez. Então, em vez de pegar 1000 caracteres e alocar 1000 bytes de RAM e copiar todo o conteúdo na RAM e depois imprimi-lo, você só precisa alocar 1 byte de RAM * e copiar cada caractere por vez e imprimi-lo.

Como você só pode ler um caractere por vez no flash, não há vantagem em ler todo o lote.


* Na verdade, por causa das otimizações do compilador, isso provavelmente nunca chega a tocar na RAM e apenas permanece um registro de CPU.

Juraj
2018-05-10 15:12:24 UTC
view on stackexchange narkive permalink

Se você tiver uma string C constante (array char) em seu código sem macro F ou programa, a string é copiada para a RAM no início e permanece lá.

Se em uma função você usar a macro F ou você cria um buffer de char de algum tamanho e copia a string do progmem no buffer, no retorno da função as variáveis ​​são excluídas da pilha e a memória é liberada.

No caso de algum grande array, se você colocá-lo no progmem e depois no código quando precisar pesquisar um valor nesse array, você precisa copiar para a RAM apenas um item do array por vez, não o array inteiro.

Julian Goldsmith
2018-05-10 20:48:08 UTC
view on stackexchange narkive permalink

Como o Majenko disse, você não precisa colocar tudo o que tem no armazenamento flash na RAM de uma vez. Você pode mover itens para a SRAM conforme necessário e reutilizar a memória quando terminar.

No entanto, você não está limitado a mover um byte por vez. Existem funções definidas em avr / pgmspace.h que podem manipular a movimentação de dados para você.

Por exemplo, você poderia fazer algo como:

  const struct mystruct_s my_value PROGMEM = {value = 1234}; // ... struct mystruct_s working_copy; memcpy_P (&working_copy, &my_value, sizeof (struct mystruct_s)); int foo = working_copy / cópia ;  


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 4.0 sob a qual é distribuído.
Loading...