Raspberry Pi:Библиотеки/WiringPi/Приоритет, прерывания и потоки/Прерывания/wiringPiISR()
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Черновик |
Функция wiringPiISR()[1]
Синтаксис
int wiringPiISR(int pin, int edgeType, void (*function)(void));
Описание
Регистрирует функцию, которая будет запущена на указанном контакте при срабатывании прерывания. Допустимые варианты для параметра edgeType – это INT_EDGE_FALLING, INT_EDGE_RISING, INT_EDGE_BOTH или INT_EDGE_SETUP. Если вы воспользуетесь INT_EDGE_SETUP, то инициализации контакта произведено не будет, потому что в этом случае функция будет «думать», что вы инициализировали контакт где-то еще (например, при помощи программы gpio). Во всех остальных случаях контакт будет экспортирован и инициализирован в соответствии с вашими указаниями. Это выполняется вызовом программы gpio, так что заранее сделайте так, чтобы она была доступна.
Номер контакта, то есть параметр pin, указывается в соответствии с тем, в каком режиме инициализирована библиотека WiringPi – это может быть собственная распиновка WiringPi, распиновка BCM_GPIO, физическая нумерация и системный режим.
Эта функция работает в любом режиме, и ее не нужно запускать с правами root-пользователя.
Функция будет вызвана при срабатывании прерывания. Когда оно сработает, сначала будет очищен планировщик, а уже потом – запущена ваша функция. Поэтому, если перед тем, как ваш обработчик завершит работу, сработает еще одно прерывание, оно будет проигнорировано. Впрочем, эта функция может отслеживать и еще одно прерывание, но если во время работы обработчика сработает больше одного прерывания, все они будут проигнорированы.
Функция запускается с высоким приоритетом (если программа запущена с помощью sudo или с правами root-пользователя) и выполняется одновременно с главной программой. У нее есть полный доступ ко всем глобальным переменным, открытым файловым дескрипторам и т.д.
Более подробно о том, как использовать эту функцию, смотрите в программе-примере «isr.c» (ищите ее в папке «examples»).