From 2446d36649ae74a48f2b542d9bb48433c357b758 Mon Sep 17 00:00:00 2001 From: Kamil Sroka Date: Thu, 25 Oct 2018 19:16:40 +0200 Subject: [PATCH] [nrf52840] fix possible permanent sleep in multiprotocol (#3202) --- examples/platforms/nrf52840/alarm.c | 37 +++++++++++++++++----------- examples/platforms/nrf52840/system.c | 2 +- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/examples/platforms/nrf52840/alarm.c b/examples/platforms/nrf52840/alarm.c index 664dff6bc..ca0b96193 100644 --- a/examples/platforms/nrf52840/alarm.c +++ b/examples/platforms/nrf52840/alarm.c @@ -95,6 +95,7 @@ typedef struct static volatile uint32_t sOverflowCounter; ///< Counter of RTC overflowCounter, incremented by 2 on each OVERFLOW event. static volatile uint8_t sMutex; ///< Mutex for write access to @ref sOverflowCounter. static volatile uint64_t sTimeOffset = 0; ///< Time overflowCounter to keep track of current time (in millisecond). +static volatile bool sEventPending; ///< Timer fired and upper layer should be notified. static AlarmData sTimerData[kNumTimers]; ///< Data of the timers. static const AlarmChannelData sChannelData[kNumTimers] = // @@ -317,6 +318,7 @@ static void HandleCompareMatch(AlarmIndex aIndex, bool aSkipCheck) case kMsTimer: case kUsTimer: sTimerData[aIndex].mFireAlarm = true; + sEventPending = true; otSysEventSignalPending(); break; @@ -479,29 +481,34 @@ void nrf5AlarmDeinit(void) void nrf5AlarmProcess(otInstance *aInstance) { - if (sTimerData[kMsTimer].mFireAlarm) + do { - sTimerData[kMsTimer].mFireAlarm = false; + sEventPending = false; + + if (sTimerData[kMsTimer].mFireAlarm) + { + sTimerData[kMsTimer].mFireAlarm = false; #if OPENTHREAD_ENABLE_DIAG - if (otPlatDiagModeGet()) - { - otPlatDiagAlarmFired(aInstance); - } - else + if (otPlatDiagModeGet()) + { + otPlatDiagAlarmFired(aInstance); + } + else #endif - { - otPlatAlarmMilliFired(aInstance); + { + otPlatAlarmMilliFired(aInstance); + } } - } - if (sTimerData[kUsTimer].mFireAlarm) - { - sTimerData[kUsTimer].mFireAlarm = false; + if (sTimerData[kUsTimer].mFireAlarm) + { + sTimerData[kUsTimer].mFireAlarm = false; - otPlatAlarmMicroFired(aInstance); - } + otPlatAlarmMicroFired(aInstance); + } + } while (sEventPending); } inline uint64_t nrf5AlarmGetCurrentTime(void) diff --git a/examples/platforms/nrf52840/system.c b/examples/platforms/nrf52840/system.c index 9db75688a..d3ebbfe5b 100644 --- a/examples/platforms/nrf52840/system.c +++ b/examples/platforms/nrf52840/system.c @@ -128,13 +128,13 @@ bool otSysPseudoResetWasRequested(void) void otSysProcessDrivers(otInstance *aInstance) { - nrf5AlarmProcess(aInstance); nrf5RadioProcess(aInstance); nrf5UartProcess(); nrf5TempProcess(); #ifndef SPIS_TRANSPORT_DISABLE nrf5SpiSlaveProcess(); #endif + nrf5AlarmProcess(aInstance); } __WEAK void otSysEventSignalPending(void)