Tutoriais

Progmem – Economizando Memória do Microcontrolador

Eletrogate 28 de setembro de 2021

Introdução

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.


Tipos de Memórias

Memória Flash

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.

 Memória SRAM (Static Random Access Memory)

É 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 EPROM (erasable programmable read-only memory) 

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.


Capacidade das Memórias dos Principais Microcontroladores


Plataforma Atmel

MCU
Flash
EEPROM
SRAM
ATmega328P32 Kb1024 bytes4 Kb
ATmega1684 Kb/8 Kb/16 Kb256 b/512 b/512 b512 b/1 Kb/1 Kb
ATmega88 Kb512 bytes1 Kb
ATmega256064 Kb/128 Kb/256 Kb4 Kb8 Kb

 

Plataforma Espressif

MCU
ROM
Flash
SRAM
ESP32
448 kBExterna: 512 kB a 16 MB520 kB
ESP8266Externa: variávelExterna: 512 kB a 16 MB160 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.


Biblioteca Utilizada

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>

Por que usar o Progmem?

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).


Prática

Sintaxe

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.

Escrita de dados

    Exemplo:

const dataType nomedavariavel[] PROGMEM = {texto1, texto2, texto3…​};

const PROGMEM dataType nomedavariavel[] = {texto1};

const dataType PROGMEM nomedavariavel[] = {texto1}; // Não utilize dessa forma
Leitura dos dados

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);

Exemplo do código completo

    //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.


Conclusão

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.


Sobre o Autor


André Calazans

Programador, Graduando em Ciência da Computação, Técnico em Eletrônica, Eletricista. Onde tiver um Elétron eu vou querer saber porque ele está ali.


Eletrogate

28 de setembro de 2021

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!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!