Entrar    Registrar

pode atribuir função para const?

Fórum sobre plataforma Arduino

Moderadores: andre_teprom, guest2003, 51, Renie

  • Autor
    Mensagem

pode atribuir função para const?

Mensagempor edsont » 10 Nov 2018 18:42

Na bibliote RCSwitch do Arduino encontrei uma declaração que eu não consegui entender.

No arquivo RCSwitch.cpp tem:

Código: Selecionar todos
  const long time = micros();
  const unsigned int duration = time - lastTime;


Não é o único lugar onde aparece este tipo de declaração, mas é onde estou com alguns problemas.
Acho que vou refazer esse negócio.
Avatar do usuário
edsont
Byte
 
Mensagens: 410
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: pode atribuir função para const?

Mensagempor andre_teprom » 10 Nov 2018 20:58

O qualificador const não implica necessariamente que aquela variável será implementada em memoria de programa, mas apenas que essa variavel nao será mais modificada ao longo do programa, e qualquer acesso de escrita na mesma deveria gerar um Warning do compilador. No caso do Arduino, talvez voce esteja confundindo o efeito de const com o de PROGMEM, que esse sim, declara o valor na área da flash do programa.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_teprom
Dword
 
Mensagens: 5264
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: pode atribuir função para const?

Mensagempor edsont » 10 Nov 2018 21:20

andre_teprom escreveu:O qualificador const não implica necessariamente que aquela variável será implementada em memoria de programa, mas apenas que essa variavel nao será mais modificada ao longo do programa, e qualquer acesso de escrita na mesma deveria gerar um Warning do compilador. No caso do Arduino, talvez voce esteja confundindo o efeito de const com o de PROGMEM, que esse sim, declara o valor na área da flash do programa.


Se o valor não é modificado não faz sentido.
duration é o intervalo entre o último evento e o evento anterior da interrupção. Tanto é que time recebe o tempo atual (micros())
Eu acabei de substituir o const por static, e alterei o time por currentTime, porque time é palavra reservada.
Continuou a mesma coisa. O problema está no algoritmo mesmo.

Tem várias variáveis declaradas como const. Não poderiam ser constantes porque estão em função de tempos obtidos durante a execução (duração dos pulsos do receptor de RF)

O mais curioso é a declaração static const. Constante obrigatoriamente teria que ser estático. const deve ter outra função que eu não conheço.
Avatar do usuário
edsont
Byte
 
Mensagens: 410
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: pode atribuir função para const?

Mensagempor andre_teprom » 10 Nov 2018 21:36

Código: Selecionar todos
const long time = micros();
const unsigned int duration = time - lastTime;


Em principio a lógica não parece estar errada; pode estar acontecendo o seguinte: Ao entrar na função onde está declarado o trecho acima, a variável time é instanciada como local, e pega o valor do temporizador do sistema, e logo a seguir calcula o tempo decorrido desde a última vez que entrou nessa função (duration) subtraindo de uma variavel - provavelmente - global lastTime. Repare que não faria sentido algum alterar no decorrer dessa função, seja o time ou o lastTime, pois são medidas lidas apenas uma vez por iteração.

Talvez o problema esteja no fato de que micros() retorna unsigned long, e se time está declarado acima como long pode estar gerando um valor de tempo negativo; enfim, experimenta mudar isso pra ver se funciona, apenas um palpite.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_teprom
Dword
 
Mensagens: 5264
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: pode atribuir função para const?

Mensagempor edsont » 10 Nov 2018 21:51

andre_teprom escreveu:
Código: Selecionar todos
const long time = micros();
const unsigned int duration = time - lastTime;


Em principio a lógica não parece estar errada; pode estar acontecendo o seguinte: Ao entrar na função onde está declarado o trecho acima, a variável time é instanciada como local, e pega o valor do temporizador do sistema, e logo a seguir calcula o tempo decorrido desde a última vez que entrou nessa função (duration) subtraindo de uma variavel - provavelmente - global lastTime. Repare que não faria sentido algum alterar no decorrer dessa função, seja o time ou o lastTime, pois são medidas lidas apenas uma vez por iteração.

Talvez o problema esteja no fato de que micros() retorna unsigned long, e se time está declarado acima como long pode estar gerando um valor de tempo negativo; enfim, experimenta mudar isso pra ver se funciona, apenas um palpite.


Já identifiquei o problema. Não são estas temporizações. O algoritmo descarta o primeiro e o último valor recebido. O transmissor do controle remoto precisa enviar pelo menos 3 vezes para que seja lido, e o meu transmissor quando o botão é acionado rapidamente só transmite uma vez. Vou ter que modificar para comprimento fixo de bits ou implementar um timeout para identificar o fim de recepção.
Avatar do usuário
edsont
Byte
 
Mensagens: 410
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Voltar para ARDUINO

Quem está online

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