@@ -716,19 +716,24 @@ void NRF5Config::HandleFDSEvent(const fds_evt_t * fdsEvent)
716716
717717 // Signal the Weave thread that the operation has completed.
718718#if defined(SOFTDEVICE_PRESENT) && SOFTDEVICE_PRESENT
719- if (xTaskGetSchedulerState () != taskSCHEDULER_NOT_STARTED)
720- {
721- BaseType_t yieldRequired = xSemaphoreGiveFromISR (sAsyncOpCompletionSem , &yieldRequired);
722- if (yieldRequired == pdTRUE)
723- {
724- portYIELD_FROM_ISR (yieldRequired);
725- }
726- }
727- else
728- #endif // defined(SOFTDEVICE_PRESENT) || !SOFTDEVICE_PRESENT
719+
720+ // When using the Nodic SoftDevice, HandleFDSEvent() is called in a SoftDevice interrupt
721+ // context. Therefore, we must use xSemaphoreGiveFromISR() to signal completion.
722+ BaseType_t yieldRequired = xSemaphoreGiveFromISR (sAsyncOpCompletionSem , &yieldRequired);
723+
724+ // Yield to the next runnable task, but only if the FreeRTOS scheduler has been started.
725+ if (xTaskGetSchedulerState () != taskSCHEDULER_NOT_STARTED && yieldRequired == pdTRUE)
729726 {
730- xSemaphoreGive ( sAsyncOpCompletionSem );
727+ portYIELD_FROM_ISR (yieldRequired );
731728 }
729+
730+ #else // defined(SOFTDEVICE_PRESENT) || !SOFTDEVICE_PRESENT
731+
732+ // When NOT using the Nodic SoftDevice, HandleFDSEvent() is called in a non-interrupt
733+ // context. Therefore, use xSemaphoreGive() to signal completion.
734+ xSemaphoreGive (sAsyncOpCompletionSem );
735+
736+ #endif // !(defined(SOFTDEVICE_PRESENT) || !SOFTDEVICE_PRESENT)
732737}
733738
734739void NRF5Config::RunConfigUnitTest ()
0 commit comments