Página 1 de 1

[urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 14 Set 2013 14:29
por r0n4ld0l1n5
Estou migrando do uc PIC para o AVR, estou tentando trabalhar com o AVR Studio 6, tanto utilizando o Arduino quanto WinAVR(Gcc). Mas, estou com um problema muito sério em relação a memória RAM, A sensação que eu tenho é q o compilador não libera o espaço de memória utilizado pelas variáveis locais das funções. Ou seja, ele fica somando as variáveis locais das funções, como se fossem variáveis globais.

exemplo:
o exemplo abaixo não vai rodar pq faltam informações, é apenas um overview do q está acontecendo..
Código: Selecionar todos
/*****************************************/
//arquivo mensagem.c
void mensagem()
{
     escreve_lcd("Mensagem1");  //ocupa 10 bytes da memoria RAM
     escreve_lcd("Mensagem2"); //ocupa 10 bytes da memoria RAM. totalizando 20 bytes
}

void mensagem2()
{
     escreve_lcd("Mensagem3");
     escreve_lcd("Mensagem4");
}

//main.c
#include"mensagem.h"

void main()
{
mensagem();
mensagem2();
}

*////////////////////////////////////*

No final da compilação ele está ocupando pouco mais de 40 bytes, ao invés de aproximadamente 20 bytes.
Até onde eu sei, as variáveis locais que estão na função mensagem, deveria ser liberada após a saída da função, mas não acontece. Quando eu compilo ele simplesmente soma as variáveis da função mensagem com as da função mensagem2...

Alguém pode me ajudar com isso? já estou ficando desesperado, pois estou a uma semana batalhando para conseguir encontrar uma solução ou explicação para isso.

Até mais

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 14 Set 2013 18:09
por andre_luis
Verifica se o compilador está configurado para otimizar velocidade, pois isso talvéz explicasse.


+++

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 14 Set 2013 22:26
por RobL
Para mim seu código está confuso. O problema está nas variáveis do seu C.
Certos compiladores, como o WinAvr (GCC) costumam interpretar para você, como variáveis static mesmo quando você esquece de definir como static. Depende de sua ação, ele vai definir como static.
Se quiser que seja local, defina a variável temporária, dentro de sua função e passe ela para lá. Veja que você está escrevendo como static, ou seja, vão ficar gravada na RAM.
Vou tentar um exemplo:
Código: Selecionar todos
void func (uint8_t  var)
{
  Porta = var ; // mandou var para porta. Nada ficou na ram
}


Se você escreve algo em uma var e posteriormente esta var será usada no seu código, se o compilador não puder antecipar o carregamento, vai gravar na ram como static para usar posteriormente em outra parte do código.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 14 Set 2013 23:52
por cfreund
Pesquise sobre pgmspace.h

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 15 Set 2013 11:44
por r0n4ld0l1n5
Valeu pessoal, pelas respostas!

Verifica se o compilador está configurado para otimizar velocidade, pois isso talvéz explicasse.

andre_teprom,
Procurei por essa informação no compilador e não encontrei, vc conhece do atmel studio saberia me dizer onde encontro essa configuração?

Para mim seu código está confuso. O problema está nas variáveis do seu C.
Certos compiladores, como o WinAvr (GCC) costumam interpretar para você, como variáveis static mesmo quando você esquece de definir como static. Depende de sua ação, ele vai definir como static.
Se quiser que seja local, defina a variável temporária, dentro de sua função e passe ela para lá. Veja que você está escrevendo como static, ou seja, vão ficar gravada na RAM.
Código: Selecionar todos
void func (uint8_t  var)
{
  Porta = var ; // mandou var para porta. Nada ficou na ram
}

Se você escreve algo em uma var e posteriormente esta var será usada no seu código, se o compilador não puder antecipar o carregamento, vai gravar na ram como static para usar posteriormente em outra parte do código.


Robl,
apesar de eu achar que os efeitos seriam os mesmos que da forma como exemplifiquei, tentei declarar um array de char local inicializando as strings que cada função contempla.
exemplo
Código: Selecionar todos
//arquivo mensagem.c
void mensagem()
{
    char text1[] = Mensagem1";
   char text2[] = Mensagem2";
     escreve_lcd(text1);  //ocupa 10 bytes da memoria RAM
     escreve_lcd(text2); //ocupa 10 bytes da memoria RAM. totalizando 20 bytes
}

void mensagem2()
{
     char text1[] = "Mensagem3";
     char text2[] = "Mensagem4";   
     escreve_lcd(text1); //funcao que recebe um ponteiro de char para escrever no lcd
     escreve_lcd(text2);
}


e também tentei declarando uma variável global e carregando a string da mensagem em cada função, por exemplo:

Código: Selecionar todos
char text1[17];
char text2[17];

void mensagem()
{
    strcpy(text1, "Mensagem1");
   strcpy( text2, "Mensagem2");
     escreve_lcd(text1);  //ocupa 10 bytes da memoria RAM
     escreve_lcd(text2); //ocupa 10 bytes da memoria RAM. totalizando 20 bytes
}

void mensagem2()
{
    strcpy(text1, "Mensagem3");
   strcpy( text2, "Mensagem4");
     escreve_lcd(text1); //funcao que recebe um ponteiro de char para escrever no lcd
     escreve_lcd(text2);
}



pra vc ver q a coisa ficou desesperadora...

O mais estranho é q eu estava programando usando o compilador do arduino, criei a classe mensagem tudo direitinho e aconteceu esse problema da falta de memória ram, logo pensei deve ser coisa do Arduino. Na sequência fiz o mesmo código no MikroC pro for AVR, quando a função foi feita de acordo com o exemplo que está no código (escreve_lcd("Mensagem1")) que abriu este tópico aconteceu a mesma coisa que no AVR studio, tive overflow de memória, já quando eu criei as variáveis locais e inicializei com as mensagens que eu queria foi perfeito, pouquíssimo consumo de memória RAM passando de 1K para 257 bytes (coisa linda)... Sabe o que é mais engraçado em tudo isso,é q fiz as mesmas coisas só que no compilador CCS do PIC e qualquer uma das forma que eu apresentei aqui tiveram os mesmo resultados, não ficaram somando as variáveis ou seja sempre com o mesmo consumo de RAM.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 15 Set 2013 11:51
por r0n4ld0l1n5
Pesquise sobre pgmspace.h


cfreund,
esse header contém a função que grava dados na memória flash do uC, não é isso? vc está sugerindo que eu use o PROGMEM? Se vc tiver uma experiência com isso por favor, me de um exemplo, uma luz, qquer coisa será bem vinda..

Valeu,

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 15 Set 2013 12:59
por andre_luis
r0n4ld0l1n5 escreveu:andre_teprom,
Procurei por essa informação no compilador e não encontrei, vc conhece do atmel studio saberia me dizer onde encontro essa configuração?


Negativo, nunca mexi com esse compilador ou com esse core, mas dando uma rápida procurada no Google pode-se encontrar algumas dicas :

Imagem

Imagem


+++

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 15 Set 2013 14:37
por RobL
Seu problema está no consumo de RAM não de Flash, então não seria optimização. Mas vamos lá:

Caso queira optimizar seu código o Atmel Studio 6 tem um botão na barra superior "debug" ou "release". Normalmente ele opera em debug. Passe para release e pronto, tá optimizado.

Se tiver strings constantes o melhor é colocá-las na Flash com o uso do atributo PROGMEM.
Desta forma é só passar para seu lcd e nada ficará na RAM (consumo zero de RAM).
Exemplo uso PROGMEM:
Código: Selecionar todos
#include <pgmspace.h>

static const uint8_t Tabela[] PROGMEM // veja aqui o atributo progmem
{
  't', 'e', 'x', 't', 'o' '1', // escolha a forma como char ou string. Aqui é exemplo.
  texto2,
  texto3
}

//Chamar da flash:

 variavel = pgm_read_byte(&Tabela[endereco relativo ao inicio da tabela]);

//pgm_read_byte e outras funcoes estao em pgmspace.



Nota: Se você usar uma variável no mesmo arquivo coloque o qualificador static na frente dela.
Se seu programa tiver um só arquivo, não vai alterar na optimização, mas se tiver mais de um arquivo poderá fazer diferença.
Experimente, teste, suas variáveis globais passando para static, caso elas sejam usadas no mesmo arquivo. Veja o resultado na versão release. Bom, isto deve alterar somente a flash, não a ram. Já o uso de progmem, dados na flash, como coloquei o consumo de ram será zero, apos a operação.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 15 Set 2013 19:49
por r0n4ld0l1n5
andre_teprom,

Essas configurações do AVR Studio eu já havia encontrado pq eu estava configurando um template para trabalhar com o arduino, depois acabei revirando ela toda pra tentar resolver esse problema da RAM, inclusive nessa parte de otimização e infelizmente sem sucesso... :? .. eu havia tbm selecionado o item Prepare functions for garbage collection, pq eu imaginei que seria o cara q faria a limpeza na saída da função e me entregaria a RAM para usar novamente, tbm sem sucesso... rsrs....

Robl,

Infelizmente vou ter q usar esse recurso do PROGMEM, depois de tanto tentar não consegui trabalhar no AVR da mesma forma q trabalho no PIC C Compiler (CCS) e no MikroC...

veja como vai ficar as minhas funções agora:

Código: Selecionar todos
PROGMEM const char mensagem1[] = "0123456789012345";
PROGMEM const char mensagem2[] = "5432109876543210";

//PROGMEM const uchar_t mensagem1[] = "CONTROLADOR SSAT\0";
   void func1()
   {
      cmd_LCD(PRIMEIRA_LINHA); //comando para enviar cursor para primeira linha
      escreve_LCD_Flash(mensagem1);
      cmd_LCD(SEGUNDA_LINHA); //envia cursor para segunda linha
      escreve_LCD_Flash(mensagem2);
   }

PROGMEM const char mensagem3[] = "acessem  o  site";
PROGMEM const char mensagem4[] = "www.asm51.eng.br";
   void Screen2()
   {
      cmd_LCD(PRIMEIRA_LINHA);
      escreve_LCD_Flash(mensagem3);
      cmd_LCD(SEGUNDA_LINHA);
      escreve_LCD_Flash(mensagem4);
   }



assim vai dar um pouco mais de trabalho pra mim, pq eu estava tentando portar o código do PIC para AVR, mas eu já tenho um caminho pra seguir...


Agradeço a todos pelas dicas/sugestões que deram até agora e se tiverem mais sugestões para acrescentarem será de grande ajuda tanto para mim, quanto para outros em consultas futuras...

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 16 Set 2013 13:03
por vtrx
Oque o RobL citou é o correto.
Infelizmente vou ter q usar esse recurso do PROGMEM

Isso é uma diretriz do compilador e deve ser usado,todo compilador tem uma inclusive o CCS.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 17 Set 2013 22:45
por r0n4ld0l1n5
E aí vtrx, td bem?

O q o Robl disse está totalmente certo, mas a questão é q eu nunca precisei me preocupar em gravar constantes na Flash, sempre utilizei no CCS na forma como está no código abaixo e ele fazia isso pra mim (pelo menos é o q eu acredito)... se eu não me engano no CCS se utiliza a diretiva #ROM...

Código: Selecionar todos
void mensagem()
{
     escreve_lcd("Mensagem1");  //ocupa 10 bytes da memoria RAM
     escreve_lcd("Mensagem2"); //ocupa 10 bytes da memoria RAM. totalizando 20 bytes
}

void mensagem2()
{
     escreve_lcd("Mensagem3");
     escreve_lcd("Mensagem4");
}




Até mais.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 18 Set 2013 00:04
por vtrx
O CCS tem vida própria :D
Mas não se esqueça que essa facilidade de algumas partes de código do CCS lhe custa espaço geral no código x desempenho.

Re: [urgente] Compilador Avr Studio não libera a memória RAM

MensagemEnviado: 18 Set 2013 22:00
por r0n4ld0l1n5
Tem toda razão vtrx... bom, o fato é o seguinte que com muita pesquisa e com a ajuda dos amigos daqui do asm51 vou reduzir e muito a curva de aprendizado para utilizar os uC AVR...