



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.
|
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 |
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).
const dataType nomedavariavel[] PROGMEM = {texto1, texto2, texto3…};
const PROGMEM dataType nomedavariavel[] = {texto1};
const dataType PROGMEM nomedavariavel[] = {texto1}; // Não utilize dessa forma
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!
|
O Progmem é uma função que libera espaço na memória dos microcontroladores, pemitindo que dados sejam salvos na Memória Flash ao invés da SRAM. Aprenda como aplicar essa técnica em seus projetos no post de hoje:
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200