Пример gpio_interrupt
Пример демонстрирует использование драйвера GPIO для проверки работы прерываний для GPIO-пинов.
Директория примера в SDK
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<platform>-<version>/examples/gpio_interrupt
Список программ
- В пример входят системные программы, поставляемые в загрузочном образе KasperskyOS, а также дополнительные системные программы и драйверы, необходимые для работы с эмулятором или конкретной аппаратной платформе, где будет запускаться решение. Подробнее см. "Архитектура и запуск решения на базе KasperskyOS".
Системные программы добавляются в образ решения автоматически при сборке.
Client– прикладная программа, взаимодействующая с драйвером GPIO. В скрипте сборки программы (файл./client/CMakeLists.txt) содержатся инструкции для упаковки прикладной программы в KPA-пакет.
Описание политики безопасности
Файл security.psl содержит описание политики безопасности решения на базе KasperskyOS и находится в директории ./einit/src. Декларации в PSL-файле снабжены комментариями, которые поясняют назначение этих деклараций.
Дополнительные файлы
В директории ./resources/xdl/gpio_interrupt расположен файл Client.edl – EDL-описание программы Client.
Файл ./einit/CMakeLists.txt содержит инструкции для сборки загрузочного образа KasperskyOS.
В директории ./einit/src/ расположены файлы настроек системной программы ServiceManager, которая отвечает за установку и запуск KPA-пакетов:
- Файл
initial_install.jsonсодержит список KPA-пакетов, которые должны быть установлены при первом запуске KasperskyOS. - Файл
system_services.jsonсодержит список установленных программ, которые должны запускаться каждый раз при запуске KasperskyOS.
Сценарий работы
Пример проверяет функциональность прерываний для 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 SDK.
После запуска примера для генерации прерываний и корректного завершения работы примера последовательно подайте на каждый из GPIO-пинов (кроме указанных в массиве ExceptionPinArr) кратковременный импульс напряжения 3,3 В.
См. "Сборка и запуск примеров".