blog-eletrogate-logo-desktop blog-eletrogate-logo-mobile
  • Categorias
    • Voltar
    • INICIANTES
    • INTERMEDIÁRIOS
    • AVANÇADOS
    • divide
    • Automação Residencial
    • Componentes Eletrônicos
    • Impressão 3D
    • IoT
    • Modelagem 3D
    • Módulos Wifi
    • Por trás da tecnologia
    • Projetos
    • Raspberry Pi
    • Robótica
    • Sensores
    • Shields
    • Sistemas Operacionais
    • Tipos de Arduino
    • Tutoriais
  • Apostilas
  • Quem Somos
  • Seja um redator
  • Trabalhe Conosco
    • Categorias
      • Voltar
      • INICIANTES
      • INTERMEDIÁRIOS
      • AVANÇADOS
      • divide
      • Automação Residencial
      • Componentes Eletrônicos
      • Impressão 3D
      • IoT
      • Modelagem 3D
      • Módulos Wifi
      • Por trás da tecnologia
      • Projetos
      • Raspberry Pi
      • Robótica
      • Sensores
      • Shields
      • Sistemas Operacionais
      • Tipos de Arduino
      • Tutoriais
    • Apostilas
    • Quem Somos
    • Seja um redator
    • Trabalhe Conosco
Loja Eletrogate
voltar
  • Introdução
  • Tipos de Memórias
  • Capacidade das Memórias dos Principais Microcontroladores
  • Biblioteca Utilizada
  • Por que usar o Progmem?
  • Prática
  • Exemplo do código completo
  • Conclusão
  • Referência
  • Sobre o Autor
Tutoriais

Progmem – Economizando Memória do Microcontrolador

Eletrogate 28 de setembro de 2021Atualizado em: 10 jun 2022

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 ATMEGA328P (utilizado pelo Arduino Uno) 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
ESP8266EXExterna: 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.


Referência

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


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 Atualizado em: 10 jun 2022

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.

Projetos

Irrigação Automática com Módulo Sensor de Umidade e Bomba Submersível

Eletrogate28 de junho de 2022

Você já esqueceu de molhar a sua planta algum dia? Se sim, esse post é perfeito para você!

Projetos

Irrigação Automática com Módulo Sensor de Umidade e Bomba Submersível

Eletrogate28 de junho de 2022

Você já esqueceu de molhar a sua planta algum dia? Se sim, esse post é perfeito para você!

Sensores

Como Utilizar o Sensor BMP280 com Arduino

Eletrogate23 de junho de 2022

O Sensor de Pressão e Temperatura BMP280 possui diversas aplicações e funcionalidades, como medir a pressão atmosférica e a temperatura ambiente.

Sensores

Como Utilizar o Sensor BMP280 com Arduino

Eletrogate23 de junho de 2022

O Sensor de Pressão e Temperatura BMP280 possui diversas aplicações e funcionalidades, como medir a pressão atmosférica e a temperatura ambiente.

Automação Residencial

Automatização do Processo de Brassagem

Eletrogate21 de junho de 2022

Este projeto foi desenvolvido para ser implementado junto à panela de brassagem. Essa ideia tem, como base, a automação de processos longos e repetitivos, que são essenciais, por exemplo, na produção de cerveja.

Automação Residencial

Automatização do Processo de Brassagem

Eletrogate21 de junho de 2022

Este projeto foi desenvolvido para ser implementado junto à panela de brassagem. Essa ideia tem, como base, a automação de processos longos e repetitivos, que são essenciais, por exemplo, na produção de cerveja.

IoT

Cotação de Moedas com HTTPClient e ESP32

Eletrogate16 de junho de 2022

Aprenda a criar um visualizador automático da cotação das moedas Dólar, Euro, Libra Esterlina, Peso Argentino, Bitcoin e Ethereum para a moeda Real. Essas serão obtidas através da biblioteca HTTPClient e visualizadas em um display OLED controlado por um ESP32.

IoT

Cotação de Moedas com HTTPClient e ESP32

Eletrogate16 de junho de 2022

Aprenda a criar um visualizador automático da cotação das moedas Dólar, Euro, Libra Esterlina, Peso Argentino, Bitcoin e Ethereum para a moeda Real. Essas serão obtidas através da biblioteca HTTPClient e visualizadas em um display OLED controlado por um ESP32.

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!

blog-eletrogate-logo-footer

Rua Rio de Janeiro, 441 - Sala 1301
Centro - Belo Horizonte/MG
CEP 30160-041
*Não temos atendimento físico

ANWAR SLEIMAN HACHOUCHE - ME
CNPJ: 18.917.521/0001-73

Atendimento

(31) 3142-3800

contato@eletrogate.com


Seg a Sex - das 8h às 17h

Institucional

  • Apostilas
  • Quem Somos
  • Privacidade
  • Seja um Redator
  • Trabalhe Conosco

Nos acompanhe

Facebook Instagram Youtube

© ELETROGATE 2022 - Todos os direitos reservados. Termos de uso e Política de privacidade.