collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


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


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


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]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
PROGMEM problema?
« em: 31 de Janeiro de 2012, 23:41 »
Boa noite,

tenho aqui um firmware que desenvolvi e que corre tudo bem, mas quando acrescento a linha "String PROGMEM bufferMsgs[100];" o firmware passa-se todo e nem sequer corre. Ou seja, o upload e a verificação está OK mas depois nao corre.

Tentei reduzir para menos posições (tentei com 10) e a mesma coisa. Se tirar o PROGMEM já dá tudo bem mas com as 100 dá problemas na mesma.

Basicamente o que eu queria era guardar 100 mensagens na memória flash.

Depois tentei com "byte PROGMEM bufferMsgs[100][80];" e ele aceita e corre tudo bem... mas se meter "byte PROGMEM bufferMsgs[500][80];" já me dá erro a compilar: error: size of array 'bufferMsgs' is too large.

Alguem sabe pq o problema do too large e o problema de usar String no PROGMEM?

Estou a usar um AT1280.

Obg.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #1 em: 01 de Fevereiro de 2012, 00:17 »
Como é que depois estás a ler as coisas que estão em flash?
Pode ser dai, estares por exemplo a usar demasiada ram e rebentar com a stack.
E 500x80 são 40K de flash, tenho ideia que o progmem tem algumas limitações no tamanho máximo de arrays, mas é uma questão de ires ler o manual do avr libC.
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #2 em: 01 de Fevereiro de 2012, 10:14 »
Olá senso.

Não estou a ler sequer ainda, não cheguei a essa fase porque qdo declarei o vector deu logo asneira. De qq forma ia ler da forma normal: String ola = bufferMsgs[0] por exemplo.


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #3 em: 01 de Fevereiro de 2012, 15:03 »
Quando colocas algo em PROGMEM ou seja na flash tens de usar funções especiais para copiar isso da flash para um buffer temporário na RAM, pois maior parte das funções de formatação de strings e companhia não funcionam com dados vindos da flash.
Podes sempre declarar as mensagens separadamente em vez de um array gigantesco, porque tens limitações quanto ao tamanho máximo de um array em progmem, podes ter é muitos.
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #4 em: 01 de Fevereiro de 2012, 15:55 »
Ok mas se quiser guardar 1000 mensagens é pouco prático ter 1000 variáveis. O uso do array é importante neste caso.

Vou explorar um pouco a coisa...


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #5 em: 01 de Fevereiro de 2012, 16:02 »
Um .txt num cartão SD é o mais adequado para tanto texto.
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #6 em: 01 de Fevereiro de 2012, 16:26 »
É verdade, tenho de ver uma biblioteca porreira de SD com FAT32.

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #7 em: 02 de Fevereiro de 2012, 00:50 »
Outro problema que tem a ver com o que falei em cima: tenho o meu firmware a funcionar porreiro... se acrescentar esta linha "byte vMensagem[128];" antes do int main() o programa entra logo num loop de resets... se tirar a linha fica tudo bem... Há coisas que não se entendem... :(

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #8 em: 02 de Fevereiro de 2012, 00:58 »
Quanta ram estás a usar em compile time?
Isso é a stack a rebentar...
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #9 em: 02 de Fevereiro de 2012, 01:03 »
Onde vejo isso? Ou referes-te à flash? Se sim estou a usar cerca de 34k (25% do total do 1280)

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #10 em: 02 de Fevereiro de 2012, 01:20 »
AVR Memory Usage
----------------
Device: atmega1280

Program:   33954 bytes (25.9% Full)
(.text + .data + .bootloader)

Data:       7019 bytes (85.7% Full)
(.data + .bss + .noinit)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #11 em: 02 de Fevereiro de 2012, 01:28 »
Data é a ram usada, estás a usar 7K dos 8K disponiveis de ram, ou seja é muito pouca ram para tudo o resto, chamadas de funções, alocação de espaço para variaveis de funções, stack para as chamadas de funções e etc, toca de poupar nessa ram.
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #12 em: 02 de Fevereiro de 2012, 01:33 »
yah... já estive aqui a fazer umas experiências e se meter uma variável fora do main() ela conta como RAM ocupada, dentro de um método já não conta. Faz todo o sentido porque ele qdo nao precisa da variavel reusa o espaço...  Variáveis globais nunca foram boa politica... :)

Ideias para poupar RAM? Meter variaveis o menos globais possivel é uma boa ideia... e mais? Nao estou a ver por onde mexer mais...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PROGMEM problema?
« Responder #13 em: 02 de Fevereiro de 2012, 01:41 »
Meter variaveis o menos globais só impede que o compilador te diga que as tens lá, pois a alocação passa a ser dinamica.
Num micro-controlador não vejo nenhuma vantagem entre variaveis globais ou não, até certo ponto é claro.
Se uma função precisa de variaveis auxiliares ou indices para loops for e afins claro que isso devem ser variaveis locais, agora buffers para usar itoa's/sprintf's pelo main e funções fora costumo ter apenas um, buffers para uarts, i2c, spi e coisas que tais são globais.
7K é muita muita tralha na ram, tenho um atmega644p ligado a um display 128x64, meia duzia de termometros, dac, adc, e mais umas coisas e estou a usar 1.8k de ram, isto já com 256 bytes de ram só em buffers circulares de uart e i2c. Se tens um ecra que precise de fonte na ram, usa progmem, e se falas em montes de texto usa um cartão sd, ou usa progmem, ter um array de array's ou ter as mensagens separadas vai dar quase a mesmo, ou então separa em vários arrays para ele não se queixar, e podes sempre passar no avrfreaks e criar um tópico a perguntar se é normal ter esse erro com o progmem, eu não te posso ajudar porque sempre que o usei nunca tive qualquer chatice.
Avr fanboy

Offline SJD22

  • Mini Robot
  • *
  • Mensagens: 660
Re: PROGMEM problema?
« Responder #14 em: 02 de Fevereiro de 2012, 10:34 »
Certo! Mas como são globais o espaço está sempre alocado em memória, correcto? Ao passo que se forem locais, a memória é libertada no final do scope da variável. Isto não significa que a stack não rebente na mesma.

Tenho de averiguar melhor onde tenho os quase 7k de ram ocupados.