Ví dụ đó từ elinux sử dụng IO ánh xạ bộ nhớ . Nhân cũng xuất giao diện không gian người dùng thông qua /sys/class/gpio
, 1 cũng được ghi lại trên elinux . Làm việc trong C bạn sẽ sử dụng mức độ thấp read()
/ write()
thay vì echo
, rõ ràng. Không sử dụng các hàm dựa trên luồng cấp cao hơn.
Một số lập trình viên trở nên hơi khó chịu khi được yêu cầu sử dụng giao diện tệp cho những việc mà họ tin rằng nên được thực hiện với các cuộc gọi hệ thống. Đây hoàn toàn là một vấn đề về phong cách - chúng tương đương với chính xác . Không có "chi phí I / O bổ sung", v.v., truy cập một tệp trong trường hợp này vì đó không phải là tệp thực, đó là giao diện kernel. Chính xác như mọi hệ thống ABI khác bạn từng sử dụng, chỉ khác nhau. Việc sử dụng /proc
và /sys
các nút đã được các nhà phát triển nhân ưa thích từ lâu, nhưng tôi vẫn thấy mọi người quyết tâm sử dụng các cuộc gọi hệ thống ở nơi họ có thể - ví dụ sysfs()
, mặc dù thực tế đã man 2 sysfs
nói rõ:
Cuộc gọi hệ thống dẫn xuất System-V này đã lỗi thời; đừng dùng nó Trên các hệ thống có / Proc, thông tin tương tự có thể được lấy thông qua / Proc / filesystems; sử dụng giao diện đó thay thế.
Đó là trang man thư viện C bảo bạn sử dụng /proc
giao diện . Nếu điều đó không đủ tốt để thuyết phục bạn, thì không có gì. /sys
là loại tương tự. Điểm là: chỉ vì bạn đang sử dụng một nút tập tin thay vì một số C cụ API không có nghĩa là bạn không làm lập trình thực sự, hoặc hiệu suất mà sẽ bị ảnh hưởng, vv vv Một số người có thể nói rằng nó thực sự là một đẹp tính năng. Đây cũng là phương pháp được đề xuất bởi những người đã viết kernel OS.
Giới thiệu nhanh về giao diện GPIO có thể được tìm thấy trong [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)
Dường như có nhiều hướng dẫn khác nhau và trực tuyến như vậy ngoài elinux. Tôi chỉ sử dụng I2C, nếu không tôi sẽ cho bạn câu trả lời trực tiếp hơn.
Nếu bạn quan tâm đến việc viết mã không gian kernel truy cập GPIO, bạn có thể xem tại đây , mặc dù tôi nghĩ rằng nó thực sự chỉ hữu ích nếu bạn muốn viết trình điều khiển cho một thiết bị cụ thể và tạo API không gian người dùng của riêng bạn.
1. Vì IO được ánh xạ mem cũng phải sử dụng đọc / ghi, tôi không chắc liệu một phương thức này có mang lại lợi thế đáng kể so với phương pháp khác ở đây không. Sử dụng /sys
giao diện chắc chắn sẽ dễ mang theo hơn, nếu bạn đang tìm kiếm mã sẽ chạy trên những thứ khác ngoài pi mâm xôi.