Пример gpio_interrupt

Пример демонстрирует использование драйвера GPIO для проверки работы прерываний для GPIO-пинов.

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<platform>-<version>/examples/gpio_interrupt

Список программ

При сборке примера для целевой аппаратной платформы в решение автоматически включаются платформенно-зависимые драйверы:

Описание инициализации

Файл описания инициализации решения init.yaml генерируется в процессе сборки решения на основе шаблона ./einit/src/init.yaml.in. Макросы вида @INIT_*@, которые содержатся в шаблоне, автоматически раскрываются в итоговом файле init.yaml. Подробнее см. "Шаблон init.yaml.in".

Описание политики безопасности

Файлы описания политики безопасности решения на базе KasperskyOS находятся в директории ./einit/src.

Файл security.psl содержит описание политики безопасности решения. Этот файл является файлом верхнего уровня, в который через декларацию use включена часть описания политики безопасности решения в виде PSL-файла dynld.psl. (Декларации в PSL-файлах снабжены комментариями, которые поясняют назначение этих деклараций.) Файл dynld.psl содержит часть описания политики безопасности, используемую при динамической компоновке компонентов решения.

Ресурсы

В директории ./resources/xdl/gpio_interrupt расположен файл Client.edl – EDL-описание программы Client.

Сценарий работы

Пример проверяет функциональность прерываний для GPIO-пинов. Общее количество пинов на плате задается макросом GPIO_PIN_NUM. В битовой маске pinsBitmap пины из массива ExceptionPinArr помечаются отработавшими, чтобы в дальнейшем пример мог корректно завершиться. Все пины, кроме указанных в массиве ExceptionPinArr, переводятся в состояние PINS_MODE. Для всех пинов, кроме указанных в массиве ExceptionPinArr, будет зарегистрирована функция обработки прерывания.

В бесконечном цикле происходит проверка условия равенства битовой маски pinsBitmap битовой маске окончания работы примера DONE_BITMASK (соответствует условию, когда прерывание произошло на каждом GPIO-пине). Далее в этом цикле вызывается функция обработчик прерывания. Если прерывание происходит впервые на пине, который не указан в массиве ExceptionPinArr, функция обработки прерывания получает это событие с помощью функции GpioGetEvent(). Соответствующий пин в битовой маске pinsBitmap помечается отработавшим. Обнаружение прерываний на этом пине отключается вызовом функции GpioReleaseMode().

Следует учитывать возможное влияние начального состояния регистров подтягивающих резисторов для каждого пина на работу примера.

На некоторых пинах GPIO могут также присутствовать внешние подтягивающие резисторы (например, в ревизиях 1.4, 1.5 платформы Raspberry Pi 4 B они есть на пинах GPIO2 и GPIO3). При наличии таких резисторов, более слабые внутренние резисторы не позволят притянуть такие пины к логическому 0.

Прерывания для событий GPIO_EVENT_LOW_LEVEL и GPIO_EVENT_HIGH_LEVEL не поддерживаются.

ExceptionPinArr – массив номеров GPIO-пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.

Сборка и запуск примера

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

После запуска примера для генерации прерываний и корректного завершения работы примера последовательно подайте на каждый из GPIO-пинов (кроме указанных в массиве ExceptionPinArr) кратковременный импульс напряжения 3,3 В.

См. "Сборка и запуск примеров".

В начало