collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[Hoje às 15:31]


Arame de Estendal por almamater
[Ontem às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: PROGMEM problema?  (Lida 6807 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #15 em: 02 de Fevereiro de 2012, 15:24 »
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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #16 em: 02 de Fevereiro de 2012, 17:19 »
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

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #17 em: 02 de Fevereiro de 2012, 18:11 »
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.


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #18 em: 02 de Fevereiro de 2012, 18:20 »
É 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

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #19 em: 02 de Fevereiro de 2012, 18:47 »
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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #20 em: 02 de Fevereiro de 2012, 18:52 »
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

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #21 em: 02 de Fevereiro de 2012, 23:54 »
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.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #22 em: 03 de Fevereiro de 2012, 00:15 »
Decididamente esta porcaria tira-me do sério...

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

Código: [Seleccione]
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!

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #23 em: 03 de Fevereiro de 2012, 01:30 »
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