Entrar    Registrar

Switch - Case bugando!

Fórum sobre plataforma Arduino

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Switch - Case bugando!

Mensagempor brasilma » 24 Mar 2020 10:09

Olá Colegas,

Estou com um probleminha aparentemente devido a encadeamento de Switch - Cases.

Faço minha estrutura de menus e sub-menus com sistema de maquina de estados controlado por switch-case.

Ontem quando acrescentei mais um case o sistema começou travar ao tentar acessar qualquer sub-menu a partir do principal.

Removendo um case de qualquer lugar volta a funcionar, como se eu houvesse atingido algum limite!

O Arduino é um Mega e o programa ocupa apenas 6% de flash e 20% de ram.

Imaginei que poderia ser alguma coisa relacionada com o Stack, porem não encontrei base.

Vocês já tiveram esse problema?

Uma saída que penso seria reduzir o encadeamento de chamadas, utilizando estrutura jump ao invés de call, mas não consegui decidir qual seria uma alternativa a uma estrutura de comando: menu();

Obrigado.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Switch - Case bugando!

Mensagempor cfreund » 24 Mar 2020 12:46

Não tem limite e também nada relacionado a stack. Provavelmente alguma falha no código. Posta essa parte.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 514
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Switch - Case bugando!

Mensagempor brasilma » 24 Mar 2020 14:21

Obrigado Claudio,

Isto já ajuda muito!!!

É muito grande / dividido em várias abas e não daria esse trabalho a vocês.

Estou fazendo mudanças na estrutura para tentar resolver e quem sabe no caminho descubro o problema!

Vou realizar as chamadas de sub-menus de uma outra forma.

Quando/se descobrir o que era volto aqui para comentar!
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Switch - Case bugando!

Mensagempor cfreund » 24 Mar 2020 17:55

A função do menu é recursiva? Se for, aí sim pode ser problema de stack e talvez seja necessário aumentar manualmente.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 514
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Switch - Case bugando!

Mensagempor edsont » 25 Mar 2020 16:13

Às vezes é coisa simples que cai no nosso ponto cego.

Não ficou faltando break em algum case?
Avatar do usuário
edsont
Byte
 
Mensagens: 452
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Switch - Case bugando!

Mensagempor brasilma » 25 Mar 2020 16:54

Então, o problema ocorre com o sistema de menus controlados com switch-case, mas talvez eles não sejam o responsável.

Sem mexer nos menus, o problema aparece e desaparece ao declarar ou comentar uma declaração de variável global do tipo String.

Com a declaração aumentam 6 bytes nas variáveis globais (estou usando apenas 1400 bytes de 8K);

Mesmo utilizando pouca memória também não parece ser isso, pois já baixei (estava usando 1440) e continua;

Não é o nome dela e nem esta sendo usada em local algum do programa;

Vou verificar a logica de funcionamento do sistema de menus e tentar relacionar com o problema...

O problema ocorre numa chamada a uma função a partir de um case, se mudo a chamada para outro case funciona, se comento o String, funciona! Durma com isso!!! Seguindo...

Comentário a parte: viva as linguagens de alto nível, facilitam algumas coisas mas trazem outros problemas...
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Switch - Case bugando!

Mensagempor cfreund » 25 Mar 2020 18:07

Tá parecendo ser tamanho de heap. Qual compilador? Usando alocação dinâmica?
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 514
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Switch - Case bugando!

Mensagempor Aquino » 25 Mar 2020 22:18

Uma das formas para simplificar a estrutura de menus é trabalhar com ponteiros de função.

Dá uma olhada nesse projeto de 2010 em que tem uma estrutura de menus um pouco mais abastraída:
https://github.com/marcosdxt/firmware_apus/blob/master/APRESENTACAO/MENU%20PARAMETROS/menu_parametros.c

Até tenho uma versão mais simples e atualizada da ideia, mas está num repositório privado. FInal de semana eu tiro ela do projeto e posto num publico pra compartilhar aqui.
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1938
Registrado em: 12 Out 2006 22:24

Re: Switch - Case bugando!

Mensagempor Aquino » 25 Mar 2020 22:22

Aqui a biblioteca que implementa o menu genérico:
https://github.com/marcosdxt/firmware_apus/blob/master/APRESENTACAO/menu_generico.c

A ideia desse menu é separar a estrutura de controle dos dados.
Então aqui, você não repete a parte de controle em cada tela, apenas os dados e funções que abrem a tela de edição.
Num outro projeto que fiz, eu ainda criei as telas: edita text, edita hex, edita list, edita bool e aí o menu é basicamente um monte de structs inicializadas passadas pra a parte de controle.
ASM51 descanse em paz!
Avatar do usuário
Aquino
Dword
 
Mensagens: 1938
Registrado em: 12 Out 2006 22:24

Re: Switch - Case bugando!

Mensagempor brasilma » 26 Mar 2020 13:00

Olá Claudio, justamente usando o F que reduzi a quantidade de memória utilizada, porem acredito que não seja isso, pois tem muita memória sobrando!

O compilador é o padrão do Arduíno estou utilizando a ultima versão 1.8.12 estava com a 1.8.10 e atualizei pensando que poderia resolver.

Aquino, esta solução é a ideal, assim que houver disponibilidade de tempo vou desenvolver uma função específica para menus desta forma, obrigado!

No momento estou na correria - todos sabem como é: fazer do jeito que dá e não como gostaríamos!!!

Outro detalhe é que em linguagem de alto nível sou novato, então muitos problemas são apenas falta de conhecimento mesmo!

No momento está funcionando (vamos ver até quando :-) )com ou sem a declaração da String, mudei a forma de chamar a função no switch-case!
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Switch - Case bugando!

Mensagempor cfreund » 26 Mar 2020 16:08

Se tem muita RAM livre, estão nos resta o famoso buffer overflow.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 514
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante