• Welcome to LusoRobótica - Robótica em Português.
 

PROGMEM problema?

Started by SJD22, 31 de January de 2012, 23:41

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SJD22

Bom... em parte já sei onde gasto muita RAM. Tinha alterado a bibliboteca "HardwareSerial.cpp" que vem no Arduino e meti os buffers circulares com tamanho 512 bytes. Ora como são 4 portas Serial cada uma com 2 buffers (Tx e Rx) isto dava-me um total de 4k (ia logo metade da RAM pro galheiro!).

Vou ter de alterar essa biblioteca porque o tamanho do buffer que preciso em cada Serial é diferente. Para a Serial que comunica por USB uns 128bytes para Tx deve dar e como não recebo nada penso que para o buffer de Rx chega 16 bytes.

senso

Basta moveres as variaveis de global para dentro do inicio do main, se as colocares ai o compilador já não te mostra que as estás a usar, mas vão estar sempre alocadas porque nunca retornas do main.
Tipicamente o buffer deve ter o tamanho da maior mensagem que queres enviar/receber, se não recebes nada metes 0 para não estragar 16 bytes em algo que nunca vai ser usado.
Avr fanboy

SJD22

0 não consigo meter porque dá division by zero lá numa parte do codigo... mas meto 1.

Entao na pratica em termos de RAM ter variaveis globais ou no main é igual... Mas é diferente porque se tiver um metodo fora do main, ele nao acede à variavel se a mesma estiver declarada no main. Por isso vou manter o que puder como global e siga.


senso

É precisamente por isso que num sistema embedded não ganhas muito em não ter globais, passas a ter de passar carradas de variaveis ás funções, o que sobre-carrega a stack nas chamadas ás funções, e depois para retorno de variaveis se for mais que uma tens de usar arrays. Variaveis que só são usadas aquando das chamadas ficam dentro das respectivas funções, agora o que for usado em todo o lado é global e siga, pelo menos é assim que tenho feito e ainda não correu mal, mas tambem nunca tive tanta ram usada, nem de perto.
Outra coisa, estás a usar as bibliotecas todas do Arduino com o avrStudio?
Avr fanboy

SJD22

Eu qdo quero retornar mais do que um valor de uma função uso uma classe / estrutura. Retornar arrays não dá, so se for passado por referência.

Estou a usar apenas a WString e o HardwareSerial e algumas poucas mais que são necessárias para compilar essas duas.

senso

A WString tambem não é do melhor, é pesada na ram, e tudo o que ela faz, as funções standart do C tambem o fazem de modo mais eficiente.
Avr fanboy

SJD22

O problema é que usando a WString posso fazer de forma amigavel: String xpto = "ola" e com a library string.h tenho de fazer char xpto[] = "ola";

A grande desantagem é que se quiser passar uma string por argumento numa função tenho de lhe passar tb o tamanho enquanto que com a classe String da WString basta passar a propria variavel.

Neste momento pus-me a mexer no codigo e isto ja nao faz nada do que quero. Refiro-me a mostrar texto no Putty que recebo do equipamento. E neste momento so tenho 45% de RAM ocupada segundo o compilador.

SJD22

Decididamente esta porcaria tira-me do sério...

Vejamos este código que estou a usar para um teste:


Serial.print("GM862");
Serial.print(" | ");
Serial.print(descricao);
Serial.print(" | ");
Serial.print(comando);
Serial.print(" | ");

Serial1.flush();
//Serial1.write(comando);
//Serial1.write(0x0D);


Ou seja o Serial mostra no Putty e o Serial1 manda para o GM862. "comando" e "descricao" são variaveis do tipo "char []".

O exemplo de cima corre bem... e o código segue jogo. Mas se eu tirar o comentário das duas últimas linhas o gajo encrava e nem sequer me imprime no Putty o comando e a descricao... simplesmente pára em "GM8" (nem escreve GM862 sequer).

Porquê? Que nervos!

senso

Se bem me recordo a escrita do serial do Arduino é bloqueante, alguma interrupção que está a ficar bloqueada de um timer ou de uma recepção de outra uart?
Avr fanboy