Membaca status GPIO menggunakan C


8

Saya telah menerapkan contoh ini untuk membiasakan diri dengan pemrograman GPIO dasar dalam C. Kode menunjukkan bagaimana menulis ke pin GPIO tetapi tidak secara eksplisit menyatakan cara membaca keadaan pin. Saya menduga bahwa WiringPi pada akhirnya akan menjadi solusi yang lebih baik karena saya ingin membaca status pin output pada akhirnya, tetapi sementara itu saya ingin menyelesaikan perjalanan saya melalui kode Dom dan Gert. Lalu, bagaimana saya bisa membaca nilai pin?


Mau jelaskan downvote?
bobthechemist

2
Downvotes itu konyol, mungkin Anda telah mengecewakan seseorang (s) di beberapa titik. +1 dari saya hanya untuk kompensasi.
goldilocks

Jawaban:


6

Contoh dari elinux menggunakan IO yang dipetakan dengan memori . Kernel juga mengekspor antarmuka ruang pengguna melalui /sys/class/gpio, 1 yang juga didokumentasikan pada elinux . Bekerja di C Anda akan menggunakan level rendah read()/ write()bukannya echo, jelas. Jangan gunakan fungsi berbasis aliran level tinggi.

Beberapa programmer menjadi sedikit kesal ketika disuruh menggunakan antarmuka file untuk hal-hal yang mereka yakini harus dilakukan dengan panggilan sistem. Ini murni masalah gaya - semuanya sama persis . Tidak ada "overhead I / O tambahan", dll., Mengakses file dalam hal ini karena ini bukan file nyata, ini adalah antarmuka kernel. Persis seperti ABI sistem lain yang pernah Anda gunakan, hanya berbeda. Penggunaan /procdan /sysnode telah lama disukai oleh para pengembang kernel, tetapi saya masih melihat orang-orang bertekad untuk menggunakan panggilan sistem di mana mereka dapat - misalnya sysfs(), terlepas dari kenyataan yang man 2 sysfsmengatakan dengan jelas:

Pemanggilan sistem turunan System-V ini sudah usang; jangan gunakan itu. Pada sistem dengan / proc, informasi yang sama dapat diperoleh melalui / proc / filesystems; gunakan antarmuka itu sebagai gantinya.

Itu adalah halaman manual C library yang memberitahu Anda untuk menggunakan /procantarmuka . Jika itu tidak cukup baik untuk meyakinkan Anda, tidak ada yang. /sysadalah hal yang sama. Intinya adalah: hanya karena Anda menggunakan file node bukannya beberapa API khusus C tidak berarti Anda tidak melakukan pemrograman nyata, atau kinerja yang akan menderita, dll. Beberapa orang mungkin mengatakan itu sebenarnya fitur yang bagus . Ini juga metode yang direkomendasikan oleh orang-orang yang menulis kernel OS.

Pengantar cepat untuk antarmuka GPIO dapat ditemukan di [kernel-src]/Documentation/ABI/testing/sysfs-gpio:

  GPIOs are only made available to userspace by an explicit
  "export" operation.  If a given GPIO is not claimed for use by
  kernel code, it may be exported by userspace (and unexported later).
  Kernel code may export it for complete or partial access.

  GPIOs are identified as they are inside the kernel, using integers in
  the range 0..INT_MAX.  See Documentation/gpio.txt for more information.

    /sys/class/gpio
        /export ... asks the kernel to export a GPIO to userspace
        /unexport ... to return a GPIO to the kernel
        /gpioN ... for each exported GPIO #N
            /value ... always readable, writes fail for input GPIOs
            /direction ... r/w as: in, out (default low); write: high, low
            /edge ... r/w as: none, falling, rising, both
        /gpiochipN ... for each gpiochip; #N is its first GPIO
            /base ... (r/o) same as N
            /label ... (r/o) descriptive, not necessarily unique
            /ngpio ... (r/o) number of GPIOs; numbered N to N + (ngpio - 1)

Tampaknya ada berbagai tutorial dan online seperti itu selain yang elinux. Saya hanya menggunakan I2C, kalau tidak saya akan memberikan jawaban yang lebih langsung.

Jika Anda tertarik untuk menulis kode ruang kernel mengakses GPIO, Anda dapat melihatnya di sini , meskipun saya pikir itu benar-benar hanya berguna jika Anda ingin menulis driver untuk perangkat tertentu dan membuat API ruang pengguna Anda sendiri.


1. Karena mem-memetakan IO juga harus menggunakan baca / tulis, saya tidak yakin apakah satu metode memberikan keuntungan yang signifikan di atas yang lain di sini. Menggunakan /sysantarmuka tentu akan lebih portabel, jika Anda mencari kode yang akan berjalan pada hal-hal selain pi raspberry.


Terima kasih. Pergi ke bahasa saya adalah Mathematica, jadi ketika porting ke RPi saya melompat. Akses GPIO melalui perintah Wolfram asli agak lamban saat ini, jadi saya mencoba untuk belajar cukup c untuk membuat saya keluar dari masalah. (jadi tidak ada kode ruang kernel yang menulis untuk saya!)
bobthechemist

read()/ write()dan fungsi deskriptor file terkait (sebagai lawan aliran file ) sebenarnya bukan Standar C, tetapi mereka POSIX dan standar di linux. Ada pengantar di sini: gnu.org/software/libc/manual/html_node/… stream file standar dapat berfungsi, tetapi menurut pengalaman saya, mereka juga merupakan WRT yang bermasalah untuk /sysdan /proc; menggunakan deskriptor tingkat bawah tidak lagi canggung atau sulit. Semoga berhasil!
goldilocks
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.