BeagleBone Black получает прерывания из пространства пользователя

Я использую Библиотека C ++ (easyBlack) обрабатывать GPIO через / dev / mem.

Как я видел в главе «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»), и кажется, что не может использоваться для программ пользовательского пространства, только в модулях. Или же Примеры которые используют драйверы ядра и наблюдают файл состояния в sysfs для реализации прерывания. Это может работать, но медленно и требует много ресурсов.

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

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

Спасибо!

3

Решение

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

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

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

Ваше программное обеспечение Userspace может открыть файл ‘value’ отвечающего ядру GPIO и может использовать функцию ‘poll’ для этого файлового дескриптора. Это позволит вашему программному обеспечению блокироваться до тех пор, пока GPIO не изменится, и затем действовать соответствующим образом, предоставляя вам возможность псевдо-прерывания в пространстве пользователя.

1

Другие решения