Home Fóruns Inventando o Futuro com DragonBoard 410C Sincronismo das GPIOs

Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • thaysathaysa
    Participante
    Número de postagens: 12

    No meu ambiente, as gpios não ficam sincronizadas após a escrita. Alguém passou por isso? Alguém sabe como resolver esse problema?

    A imagem mostra a disparidade entre o nível escrito em /sys/class/gpio/gpio<X>/value e o nível lido. Uma opção é um loop na leitura da gpio e esperar até que a leitura fique ok para o nível que foi solicitado durante o processo de escrita. Não tem outra alternativa?

    Execução via programa C com libsoc. A porta A0 da Linker Mezzanine está conectada em um multiplexador/demultiplexador, este escreve em 3 GPIOs frequentemente(também conectados na Linker Mezzanine). Preciso da leitura correta em tempo real para coletar os valores dos sensores/atuadores conectados no multiplexador/demultiplexador. Os dados estão sujos, pois as GPIOs não ficam sincronizadas após escrita. O mesmo circuito funciona ok quando conectado ao Arduino.

    Esse gap de sincronismo também ocorreu com alguns exemplos do libsoc, por exemplo, substituir o grove touch pelo do button http://learn.linksprite.com/96-board/touch-sensor-and-led/

    Obrigada

    ulipeulipe
    Mestre
    Número de postagens: 16

    @thaysa, tempo real vai ser bem dificil , visto que a leitura do GPIO usando syscalls não é deterministica, ou seja sempre vai variar o tempo em que voce escreve até que o valor seja disponibilizado na saida do GPIO, o mesmo ocorre na leitura por meio da syscalls.

    Uma forma interessante de medir o periodo é utilize a time.h para capturar o time corrente (em nanossegundos), escreva no gpio desejado, aguarde a leitura do mesmo gpio usando poll() ou epoll(), no momento em que retornar, leia o tempo corrente novamente e calcule a diferença da primeira leitura, voce pode refazer o processo varias vezes para saber se a variação está grande (além do aceitável) entre escrita e leitura partindo da aplicação.

    Uma solução para seu problema é ao acessaro o driver do gpio eh desabilitar o flag O_NONBLOCK durante a função open(), com isso ao executar uma tarefa write, ela só vai retornar depois que a syscall for completamente encerrada ou seja após o Linux fazer um write_l() que é o acesso mais baixo ao hardware sendo a escrita direto ao registradpr do controlador do GPIO.

    Se eu puder ajudar mais, pergunta ai 🙂

    Felipe

Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Você deve fazer login para responder a este tópico.