Я реализовал этот пример, чтобы познакомиться с базовым программированием на GPIO на языке C. Код демонстрирует, как записывать на контакты GPIO, но не указывает явно, как считывать состояние контактов. Я подозреваю, что WiringPi в конечном итоге будет лучшим решением, так как в конечном итоге я захочу прочитать состояние выходного вывода , но пока что я хотел бы завершить свой поход через код Dom и Gert. Как тогда, я мог прочитать значение булавки?
8
Ответы:
Этот пример из elinux использует отображенный в память ввод -вывод . Ядро также экспортирует пространство интерфейса пользователя через
/sys/class/gpio
, 1 , который также документированной на elinux . Работая в C, вы бы использовали низкий уровеньread()
/write()
вместоecho
, очевидно. Не используйте потоковые функции более высокого уровня.Некоторые программисты немного расстраиваются, когда им говорят, что нужно использовать файловый интерфейс для вещей, которые, по их мнению, следует делать с помощью системных вызовов. Это чисто вопрос стиля - это одно и то же . В этом случае нет необходимости в «дополнительных затратах на ввод-вывод» и т. Д., Потому что это не настоящий файл, а интерфейс ядра. Точно так же, как любая другая система ABI, которую вы когда-либо использовали, только другая. Разработчики ядра давно предпочитают использовать узлы
/proc
и/sys
, но я все еще вижу людей, решивших использовать системные вызовы там, где они могут, напримерsysfs()
, несмотря на то,man 2 sysfs
что ясно сказано:Это справочная страница библиотеки C, рассказывающая вам об использовании
/proc
интерфейса . Если этого недостаточно, чтобы убедить вас, ничего не значит./sys
это то же самое. Дело в том, что то, что вы используете файловый узел вместо какого-то специфичного для C API, не означает, что вы не занимаетесь реальным программированием, что производительность снижается и т. Д. И т. Д. Некоторые люди могут сказать, что это действительно хорошая функция. Это также метод, рекомендованный людьми, которые написали ядро ОС.Краткое введение в интерфейс GPIO можно найти в
[kernel-src]/Documentation/ABI/testing/sysfs-gpio
:Там, кажется, различные учебники и такие онлайн, в дополнение к Elinux. Я только использовал I2C, иначе я бы дал вам более прямой ответ.
Если вы заинтересованы в написании кода пространства ядра для доступа к GPIO, вы можете посмотреть здесь , хотя я думаю, что это действительно полезно, только если вы хотите написать драйвер для конкретного устройства и создать свой собственный API пространства пользователя.
1. Поскольку мем-сопоставленный ввод-вывод также должен использовать чтение / запись, я не уверен, что один метод дает здесь существенное преимущество перед другим. Использование
/sys
интерфейса, безусловно, будет более переносимым, если вы ищете код, который будет работать не только на Raspberry Pi.источник
read()
/write()
и связанные функции файлового дескриптора (в отличие от файлового потока ) на самом деле не являются стандартом C, но являются POSIX и стандартом для linux. Здесь есть введение: gnu.org/software/libc/manual/html_node/… Стандартные файловые потоки могут работать, но, по моему опыту, они также были проблематичными для WRT/sys
и/proc
; использование дескрипторов более низкого уровня больше не является неловким или трудным. Удачи!