2014-11-10 6 views
3

Я использую C++ library (easyBlack) для обработки GPIO через/dev/mem.BeagleBone Black получить прерывания из пользовательского пространства

Как я видел в главе «25.3.3 Прерывание функции» из «AM335x SitaraTM процессоров - Техническое справочное руководство»

Для того, чтобы генерировать запрос на прерывание к процессору хоста, на определенное событие (уровень или логический переход), возникающий на выводе GPIO, регистры конфигурации GPIO должны быть запрограммированы следующим образом:

• Прерывания для канала GPIO должны быть включены в регистры GPIO_IRQSTATUS_SET_0 и/или GPIO_IRQSTATUS_SET_1.

• Ожидаемые события на входе GPIO для запуска запроса прерывания должны быть выбраны в регистрах GPIO_LEVELDETECT0, GPIO_LEVELDETECT1, GPIO_RISINGDETECT и GPIO_FALLINGDETECT.

До тех пор пока все в порядке, но вся документация, которую я могу найти, основана на использовании файлов заголовков ядра Linux («linux/gpio.h» и «linux/interrupt.h»), и кажется, что их нельзя использовать для программ пользовательского пространства, только в модулях. Или examples, которые используют драйверы ядра и просматривают файл состояния в sysfs для реализации прерывания. Это может работать, но работает медленно и требует много ресурсов.

Есть ли другая альтернатива, кроме как работать с многопоточным, чтобы увидеть, изменяют ли значения требуемые контакты? (Как эта другая библиотека - github.com/jackmitch/libsoc)

Может быть, скомпилировать easyBlack как модуль ядра?

Спасибо!

ответ

1

К сожалению, истинных прерываний невозможно попасть в пространство пользователя. Вот почему весь код, зависящий от прерывания, написан либо в модуле ядра, либо в самом ядре. Обычно это нормально. ISR должен по дизайну быть как можно быстрее и оставлять фактическую обработку запланированной позже. Это похоже на то, что вы упомянули выше, с файлом состояния в sysfs. Для вас, однако, похоже, что библиотека easyBlack поддерживает память, сопоставляющую пространство памяти GPIO в пользовательском пространстве, а затем позволяет вам опросить статус вывода. Примеры, которые показаны, будут чрезвычайно интенсивными в обработке, поскольку в основной петле во время сна нет сна. Это означает, что процесс займет столько же времени процессора, сколько позволит планировщик.

Поскольку Beaglebone работает с встроенным ядром Linux, я предполагаю, что драйвер libGPIO был написан для поддержки GPIO. LibGPIO - это основа в ядре Linux, которая абстрагирует некоторые детали gora различных устройств GPIO и представляет собой стандартный интерфейс. Попробуйте найти в каталоге /sys/class/gpio. Это должно предоставить вам либо список GPIO, либо GPIO Chips.

Вот документация GPIOsysfs https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

Ваше программное обеспечение может пространство пользователя открыть файл «значения» в coresponding GPIO, а может использование функции «опрос» на том, куда и. Это позволит вашему программному обеспечению блокироваться до тех пор, пока GPIO не изменится, а затем действовать соответствующим образом, что даст вам возможность псевдопрерыва в пользовательском пространстве.