Muitos desenvolvedores têm dificuldade em lidar com o tamanho máximo de memória dos microcontroladores em uso, considerada por muitos como uma barreira intransponível para desenvolver projetos mais complexos.
Em alguns casos, como por exemplo o Microcontrolador Atmel Atmega328p-pu (utilizado pelo Uno R3 + Cabo Usb para Arduino) que tem uma SRam de 2 kilobytes necessita de uma habilidade apurada do desenvolvedor na hora de criar seus códigos. Mas para o programador menos experiente se torna uma atividade impossível lidar com tão poucas memórias, desestimulando o iniciante.
Assim, o Progmem resolve em alguns casos a limitação que os microcontroladores têm em relação ao tamanho da memória, possibilitando que dados sejam salvos na Memória Flash ao invés da SRAM e, consequentemente, liberando mais memória na hora de executar o programa.
Ao contrário do que o nome possa sugerir, essa é uma memória não volátil, ou seja, ela não é apagada caso o sistema esteja desenergizado, permanecendo salvo suas informações mesmo com o microcontrolador desligado. Possui um tempo de resposta rápida levando-se em conta se tratar uma memória não volátil e é nela onde são salvo os códigos (sketch’s) dos microcontroladores.
É uma memória volátil, ou seja, as informações só permanecem nela se houver energia, assim todos os dados são perdidos ao desligar o microcontrolador. É normalmente a memória mais rápida dos microcontroladores, onde o código é “executado” e até então onde são criadas e manipuladas as variáveis. É a memória “RAM” dos microcontroladores.
Memória não volátil de longa duração, onde os dados se mantêm quando a energia é desligada e serve para armazenar dados que não serão escritos com frequência.
MCU
|
Flash
|
EEPROM
|
SRAM
|
ATmega328P | 32 Kb | 1024 bytes | 4 Kb |
ATmega168 | 4 Kb/8 Kb/16 Kb | 256 b/512 b/512 b | 512 b/1 Kb/1 Kb |
ATmega8 | 8 Kb | 512 bytes | 1 Kb |
ATmega2560 | 64 Kb/128 Kb/256 Kb | 4 Kb | 8 Kb |
MCU
|
ROM
|
Flash
|
SRAM
|
|
|
448 kB | Externa: 512 kB a 16 MB | 520 kB | |
ESP8266 | Externa: variável | Externa: 512 kB a 16 MB | 160 kB |
Essas tabelas contêm valores de referências. Os fabricantes têm o costume de efetuar inúmeras mudanças em cada projeto, alterando apenas uma letra ou número de referência para diferenciar um microcontrolador um do outro, sendo impossível enumerar neste artigo todos os microcontroladores existentes.
A biblioteca utilizada pelo Progmem é a pgmspace.h que vem nativamente na IDE Arduino, porém nas versão anteriores à 1.0 não está presente, assim caso o desenvolvedor esteja utilizando uma versão desatualizada da IDE, procure atualizar a sua versão ou incluir a seguinte linha na parte superior do código para incorpora a biblioteca:
#include <avr/pgmspace.h>
Na tabela anterior é possível verificar que o microcontrolador ATmega328P possui uma memória Sram de 2 kb e Flash de 32 Kb, assim o programador deve ser astuto na hora de desenvolver a aplicação, para que não ocorra uma espécie de buffer overflow (transbordamento de dados), travando a execução do microcontrolador.
O programador pode até desenvolver o esboço e efetuar o upload sem apresentar qualquer tipo de problema, mas na hora de executar o programa ou durante a execução, o microcontrolador pode travar e gerar grandes problemas, podendo deixar de funcionar ou ou apresentar erros no funcionamento.
A própria documentação oficial do Arduino orienta que, para saber se os travamentos que estão acontecendo, basta comentar ou encurtar as strings ou até mesmo utilizar outros tipos de dados e efetuar testes. Assim, descobrindo o problema e reconhecendo que os travamentos ocorrem por conta do buffer overflow, o programador terá traçar uma estratégia para sanar esse problema sem prejudicar a usabilidade do microcontrolador.
Assim, a solução é a utilização do expediente Progmem que registra as variáveis na memória Flash ao invés da Sram liberando mais memória na execução do programa.
É bom lembrar que existe outras soluções para que o buffer overflow não ocorra, porém são mais complexas e necessitam de outros dispositivos para armazenar os dados, ou ainda, como já mencionado a utilização de outros tipos de variáveis, porém essas soluções não de fácil aplicação, já que a primeira necessita de um outro dispositivo para armazenar os dados – gerando mais custos, e a última pode ser impossível visto que nem sempre as variáveis armazenam apenas números (como as strings, por exemplo).
Existem várias formas de implementar o Progmem na sintaxe no microcontroladores, não é uma regra rígida, já que o Progmem é um modificador de variável e o compilador aceita as diferentes formas de sintaxe.
Exemplo:
const dataType nomedavariavel[] PROGMEM = {texto1, texto2, texto3…}; const PROGMEM dataType nomedavariavel[] = {texto1}; const dataType PROGMEM nomedavariavel[] = {texto1}; // Não utilize dessa forma
Depois de declarar a variável ou constante é hora de efetuar a leitura dos dados da memória do programa para a memória RAM. A leitura dos dados é feita por meio de funções da biblioteca pgmspace.h.
Exemplo:
nomedanovavariavel= pgm_read_byte_near(nomedavariavel);
//gravação da variável/constante const char mensagem[] PROGMEM = " A vida passa muito rápido. E se você não curtir de vez em quando, a vida passa e você nem vê.” – Frase do filme Curtindo a vida adoidado"; char mensagem_final; //comunicação serial void setup() { Serial.begin(9600); //myChar = pgm_read_word(mensagem); //leitura da variavel/constante for (byte k = 0; k < strlen_P(mensagem); k++) { mensagem_final = pgm_read_byte_near(mensagem + k); //percorre todo o vetor Serial.print(mensagem_final); } } void loop() { }
As variáveis devem ser definidas no escopo global OU com a palavra-chave static, para que o Progmem funcione.
É bom observar também que a memória Flash, conforme datasheet dos maiores fabricantes, tem uma vida de 10.000 ciclos, assim é bom utilizar o Progmem com cuidado para não diminuir a vida útil do Microcontrolador.
O Progmem é um divisor de águas para o desenvolvedor. A pessoa que sabe utilizar o Progmem pode se dizer um desenvolvedor pleno, já que para utilizar esse expediente é necessário o conhecimento de algumas técnicas de programação em C++ que um usuário que está começando vai ter muita dificuldade em implementar.
O progmem pode fazer o desenvolvedor economizar muito dinheiro, já que o projetista pode comprar um microcontrolador mais barato com uma memória menor, reduzindo assim os custos desnecessários através da criatividade e do conhecimento.
Leia a documentação Oficial.
Biblioteca – https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
Progmem no Arduino – https://www.arduino.cc/reference/pt/language/variables/utilities/progmem/
Progmem no Esp8266 – https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!