Eu implementei este exemplo para me familiarizar com a programação GPIO básica em C. O código demonstra como gravar nos pinos do GPIO, mas não indica explicitamente como ler o estado dos pinos. Suspeito que o WiringPi acabe sendo uma solução melhor, pois , eventualmente, vou querer ler o estado de um pino de saída , mas, enquanto isso, gostaria de concluir minha jornada pelo código de Dom e Gert. Como então, eu poderia ler o valor de um alfinete?
8
Respostas:
Esse exemplo do elinux usa E / S mapeadas na memória . O kernel também exporta uma interface de espaço do usuário via
/sys/class/gpio
, 1 que também está documentada no elinux . Trabalhando em C, você usaria baixo nívelread()
/ emwrite()
vez deecho
, obviamente. Não use funções baseadas em fluxo de nível superior.Alguns programadores ficam um pouco chateados quando instruídos a usar uma interface de arquivo para coisas que eles acreditam que devem ser feitas com chamadas do sistema. Isso é puramente uma questão de estilo - eles representam exatamente a mesma coisa . Não há "sobrecarga adicional de E / S", etc., acessando um arquivo nesse caso porque não é um arquivo real, é uma interface do kernel. Exatamente como qualquer outro sistema ABI que você já usou, apenas diferente. O uso de
/proc
e/sys
nós tem sido preferido pelos desenvolvedores do kernel, mas ainda vejo pessoas determinadas a usar chamadas do sistema onde podem - por exemplosysfs()
, apesar do fato deman 2 sysfs
dizer claramente:Essa é uma página de manual da biblioteca C que diz para você usar a
/proc
interface . Se isso não é bom o suficiente para convencê-lo, nada é./sys
é o mesmo tipo de coisa. Ponto é: só porque você está usando um nó de arquivo em vez de algum API C específico não significa que você não está fazendo a programação real, ou que o desempenho vai sofrer, etc. etc. Algumas pessoas podem dizer que é realmente um bom recurso. É também o método recomendado pelas pessoas que escreveram o kernel do SO.Uma rápida introdução à interface GPIO pode ser encontrada em
[kernel-src]/Documentation/ABI/testing/sysfs-gpio
:Parece haver vários tutoriais e outros online, além do elinux. Só uso I2C, caso contrário, daria uma resposta mais direta.
Se você estiver interessado em escrever o código de espaço do kernel acessando o GPIO, pode dar uma olhada aqui , embora eu pense que isso é realmente útil apenas se você quiser escrever um driver para um dispositivo específico e criar sua própria API de espaço do usuário.
1. Como as E / S mapeadas por mem também devem usar leitura / gravação, não tenho certeza se um método oferece uma vantagem significativa sobre o outro aqui. O uso da
/sys
interface certamente será mais portátil, se você estiver procurando por um código que será executado em outras coisas que não um pi framboesa.fonte
read()
/write()
e as funções baseadas no descritor de arquivo associado (em oposição ao fluxo de arquivos ) não são realmente o Padrão C, mas são POSIX e padrão no linux. Há uma introdução aqui: gnu.org/software/libc/manual/html_node/… Os fluxos de arquivos padrão podem funcionar, mas, na minha experiência, eles também foram problemáticos para o WRT/sys
e/proc
; usar os descritores de nível inferior não é mais difícil ou difícil. Boa sorte!