Для чего нужна функция sd_app_evt_wait |
![]() |
Добавил(а) microsin |
Функция sd_app_evt_wait приостанавливает работу приложения и ожидает наступления события приложения (application event). uint32_t sd_app_evt_wait (void); Событие приложения это либо прерывание приложения (application interrupt), либо ожидающее обработки прерывание, когда прерывание запрещено. Обычно вызов функции sd_app_evt_wait вставлен в бесконечный цикл функции main. Когда прерывание разрешено, прерывание будет выполнено немедленно, поскольку функция sd_app_evt_wait будет ожидать в режиме потока, а затем выполнение кода будет возвращено в основной поток приложения (произойдет очередная прокрутка тела бесконечного цикла). Если прерывание запрещено, его соответствующий флаг установлен и ожидает обработки, то после вызова функции sd_app_evt_wait произойдет немедленный возврат из неё, и управление будет возвращено в основной поток приложения. Приложение должно гарантировать, что флаг ожидания обработки прерывания очищен вызовом sd_nvic_ClearPendingIRQ, чтобы произошел переход в режим сна с помощью функции sd_app_evt_wait. Это надо делать только для запрещенных прерываний, поскольку для разрешенных прерываний обработчик прерывания (ISR) будет сам очищать свой флаг прерывания. Чтобы произошло пробуждение из состояния с запрещенными прерываниями, должен быть установлен флаг SEVONPEND в системном регистре управления Cortex-M0 (System Control Register, SCR). См. также CMSIS_SCB [3]. Примечание: если с момента последнего вызова sd_app_evt_wait произошло прерывание приложения, эта функция немедленно сделает возврат и вернет управление в вызывавший код без входа в режим сна. Это позволяет избежать состояний гонки (race conditions), которые могут произойти, когда флаг обновляется в обработчике прерывания, и обрабатывается в главном цикле main. По сути функция sd_app_evt_wait это обертка над ARM-инструкцией WFE (Wait For Event [2, 3]), которая переводит CPU в состояние пониженного потребления энергии (low-power state). Можно предположить, что Nordic добавила в этой функции некоторый функционал по сохранению внутреннего состояния, чтобы безопасно разбудить CPU и как можно быстрее приступить к обработке критичных по времени процедур радиообмена. Состояние после возврата: произошло прерывание приложения, или установился флаг прерывания, требующий обработки. Возвращаемое значение: NRF_SUCCESS. [Ссылки] 1. S132 SoftDevice v3.0.0 API sd_app_evt_wait site:infocenter.nordicsemi.com. |