Функция 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. 2. Режимы пониженного энергопотребления STM32F103xx. 3. Bluetooth: аббревиатуры и термины. |