void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) { TickType_t wakeupTime; /* Make sure the SysTick reload value does not overflow the counter. */ if( xExpectedIdleTime > portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) { xExpectedIdleTime = portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP; } /* Block the scheduler now */ portDISABLE_INTERRUPTS(); /* Stop tick events */ nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); /* Configure CTC interrupt */ wakeupTime = nrf_rtc_counter_get(portNRF_RTC_REG) + xExpectedIdleTime; wakeupTime &= portNRF_RTC_MAXTICKS; nrf_rtc_cc_set(portNRF_RTC_REG, 0, wakeupTime); nrf_rtc_event_clear(portNRF_RTC_REG, NRF_RTC_EVENT_COMPARE_0); nrf_rtc_int_enable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); if( eTaskConfirmSleepModeStatus() == eAbortSleep ) { portENABLE_INTERRUPTS(); } else { TickType_t xModifiableIdleTime = xExpectedIdleTime; configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); if( xModifiableIdleTime > 0 ) { __DSB(); #ifdef SOFTDEVICE_PRESENT /* With SD there is no problem with possibility of interrupt lost. * every interrupt is counted and the counter is processed inside * sd_app_evt_wait function. */ portENABLE_INTERRUPTS(); sd_app_evt_wait(); #else /* No SD - we would just block interrupts globally. * BASEPRI cannot be used for that because it would prevent WFE from wake up. */ __disable_irq(); portENABLE_INTERRUPTS(); do{ __WFE(); } while(0 == (NVIC->ISPR[0] | NVIC->ISPR[1])); __enable_irq(); #endif } configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); portENABLE_INTERRUPTS(); } // We can do operations below safely, because when we are inside vPortSuppressTicksAndSleep // scheduler is already suspended. nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); nrf_rtc_int_enable (portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); }
nrfx_err_t nrfx_rtc_cc_disable(nrfx_rtc_t const * const p_instance, uint32_t channel) { NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_ASSERT(channel<p_instance->cc_channel_count); nrfx_err_t err_code; uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); err_code = NRFX_ERROR_TIMEOUT; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } NRFX_LOG_INFO("RTC id: %d, channel disabled: %lu.", p_instance->instance_id, channel); err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
void nrf_drv_rtc_tick_disable(nrf_drv_rtc_t const * const p_instance) { uint32_t mask = NRF_RTC_INT_TICK_MASK; nrf_rtc_event_disable(p_instance->p_reg, mask); nrf_rtc_int_disable(p_instance->p_reg, mask); }
static void HandleCompareMatch(AlarmIndex aIndex, bool aSkipCheck) { nrf_rtc_event_clear(RTC_INSTANCE, sChannelData[aIndex].mCompareEvent); uint64_t usecTime = nrf5AlarmGetCurrentTime(); uint32_t now; if (aIndex == kMsTimer) { now = (uint32_t)(usecTime / US_PER_MS); } else { now = (uint32_t)usecTime; } // In case the target time was larger than single overflow, // we should only strike the timer on final compare event. if (aSkipCheck || AlarmShallStrike(now, aIndex)) { nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareInt); sTimerData[aIndex].mFireAlarm = true; PlatformEventSignalPending(); } }
void nrf5AlarmInit(void) { sTimeOffset = 0; memset(sTimerData, 0, sizeof(sTimerData)); // Setup low frequency clock. nrf_drv_clock_lfclk_request(NULL); while (!nrf_drv_clock_lfclk_is_running()) {} // Setup RTC timer. NVIC_SetPriority(RTC_IRQN, RTC_IRQ_PRIORITY); NVIC_ClearPendingIRQ(RTC_IRQN); NVIC_EnableIRQ(RTC_IRQN); nrf_rtc_prescaler_set(RTC_INSTANCE, 0); nrf_rtc_event_clear(RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); nrf_rtc_event_enable(RTC_INSTANCE, RTC_EVTEN_OVRFLW_Msk); nrf_rtc_int_enable(RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK); for (uint32_t i = 0; i < kNumTimers; i++) { nrf_rtc_event_clear(RTC_INSTANCE, sChannelData[i].mCompareEvent); nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[i].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[i].mCompareInt); } nrf_rtc_task_trigger(RTC_INSTANCE, NRF_RTC_TASK_START); }
/**@brief Generic function for handling RTC interrupt * * @param[in] p_reg Pointer to instance register structure. * @param[in] instance_id Index of instance. */ __STATIC_INLINE void nrf_drv_rtc_int_handler(NRF_RTC_Type * p_reg, uint32_t instance_id) { uint32_t i; uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; for (i = 0; i < RTC_CHANNEL_NUM; i++) { if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) { nrf_rtc_event_disable(p_reg,int_mask); nrf_rtc_int_disable(p_reg,int_mask); nrf_rtc_event_clear(p_reg,event); m_handlers[instance_id]((nrf_drv_rtc_int_type_t)i); } int_mask <<= 1; event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); } event = NRF_RTC_EVENT_TICK; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg, event); m_handlers[instance_id](NRF_DRV_RTC_INT_TICK); } event = NRF_RTC_EVENT_OVERFLOW; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg,event); m_handlers[instance_id](NRF_DRV_RTC_INT_OVERFLOW); } }
static void AlarmStartAt(uint32_t aTargetTime, AlarmIndex aIndex) { uint32_t targetCounter; uint32_t now; nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareInt); nrf_rtc_event_enable(RTC_INSTANCE, sChannelData[aIndex].mCompareEventMask); sTimerData[aIndex].mTargetTime = aTargetTime; targetCounter = TimeToTicks(sTimerData[aIndex].mTargetTime, aIndex); nrf_rtc_cc_set(RTC_INSTANCE, sChannelData[aIndex].mChannelNumber, targetCounter); now = AlarmGetCurrentTimeRtcProtected(aIndex); if (AlarmShallStrike(now, aIndex)) { HandleCompareMatch(aIndex, true); } else { nrf_rtc_int_enable(RTC_INSTANCE, sChannelData[aIndex].mCompareInt); } }
void nrfx_rtc_tick_disable(nrfx_rtc_t const * const p_instance) { uint32_t mask = NRF_RTC_INT_TICK_MASK; nrf_rtc_event_disable(p_instance->p_reg, mask); nrf_rtc_int_disable(p_instance->p_reg, mask); NRFX_LOG_INFO("Tick events disabled."); }
static void AlarmStop(AlarmIndex aIndex) { nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareInt); nrf_rtc_event_clear(RTC_INSTANCE, sChannelData[aIndex].mCompareEvent); sTimerData[aIndex].mFireAlarm = false; }
void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) { TickType_t wakeupTime; /* Make sure the SysTick reload value does not overflow the counter. */ if( xExpectedIdleTime > portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) { xExpectedIdleTime = portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP; } /* Block the scheduler now */ portDISABLE_INTERRUPTS(); /* Stop tick events */ nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); /* Configure CTC interrupt */ wakeupTime = nrf_rtc_counter_get(portNRF_RTC_REG) + xExpectedIdleTime; wakeupTime &= portNRF_RTC_MAXTICKS; nrf_rtc_cc_set(portNRF_RTC_REG, 0, wakeupTime); nrf_rtc_event_clear(portNRF_RTC_REG, NRF_RTC_EVENT_COMPARE_0); nrf_rtc_int_enable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); if( eTaskConfirmSleepModeStatus() == eAbortSleep ) { portENABLE_INTERRUPTS(); } else { TickType_t xModifiableIdleTime = xExpectedIdleTime; configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); if( xModifiableIdleTime > 0 ) { __DSB(); do{ __WFE(); } while(0 == (NVIC->ISPR[0])); } configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); portENABLE_INTERRUPTS(); } // We can do operations below safely, because when we are inside vPortSuppressTicksAndSleep // scheduler is already suspended. nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); nrf_rtc_int_enable (portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); }
nrfx_err_t nrfx_rtc_cc_set(nrfx_rtc_t const * const p_instance, uint32_t channel, uint32_t val, bool enable_irq) { NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_ASSERT(channel<p_instance->cc_channel_count); nrfx_err_t err_code; uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg, int_mask); nrf_rtc_int_disable(p_instance->p_reg, int_mask); val = RTC_WRAP(val); if (m_cb[p_instance->instance_id].reliable) { nrf_rtc_cc_set(p_instance->p_reg,channel,val); uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); int32_t diff = cnt - val; if (cnt < val) { diff += RTC_COUNTER_COUNTER_Msk; } if (diff < m_cb[p_instance->instance_id].tick_latency) { err_code = NRFX_ERROR_TIMEOUT; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } else { nrf_rtc_cc_set(p_instance->p_reg,channel,val); } if (enable_irq) { nrf_rtc_event_clear(p_instance->p_reg,event); nrf_rtc_int_enable(p_instance->p_reg, int_mask); } nrf_rtc_event_enable(p_instance->p_reg,int_mask); NRFX_LOG_INFO("RTC id: %d, channel enabled: %lu, compare value: %lu.", p_instance->instance_id, channel, val); err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
void nrf5AlarmDeinit(void) { nrf_rtc_task_trigger(RTC_INSTANCE, NRF_RTC_TASK_STOP); for (uint32_t i = 0; i < kNumTimers; i++) { nrf_rtc_event_clear(RTC_INSTANCE, sChannelData[i].mCompareEvent); nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[i].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[i].mCompareInt); } nrf_rtc_int_disable(RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK); nrf_rtc_event_disable(RTC_INSTANCE, RTC_EVTEN_OVRFLW_Msk); nrf_rtc_event_clear(RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); NVIC_DisableIRQ(RTC_IRQN); NVIC_ClearPendingIRQ(RTC_IRQN); NVIC_SetPriority(RTC_IRQN, 0); nrf_drv_clock_lfclk_release(); }
void nrf_drv_rtc_uninit(nrf_drv_rtc_t const * const p_instance) { uint32_t mask = NRF_RTC_INT_TICK_MASK | NRF_RTC_INT_OVERFLOW_MASK | NRF_RTC_INT_COMPARE0_MASK | NRF_RTC_INT_COMPARE1_MASK | NRF_RTC_INT_COMPARE2_MASK | NRF_RTC_INT_COMPARE3_MASK; ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); nrf_drv_common_irq_disable(p_instance->irq); nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); nrf_rtc_event_disable(p_instance->p_reg, mask); nrf_rtc_int_disable(p_instance->p_reg, mask); m_cb[p_instance->instance_id].state = NRF_DRV_STATE_UNINITIALIZED; }
void nrfx_rtc_uninit(nrfx_rtc_t const * const p_instance) { uint32_t mask = NRF_RTC_INT_TICK_MASK | NRF_RTC_INT_OVERFLOW_MASK | NRF_RTC_INT_COMPARE0_MASK | NRF_RTC_INT_COMPARE1_MASK | NRF_RTC_INT_COMPARE2_MASK | NRF_RTC_INT_COMPARE3_MASK; NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_IRQ_DISABLE(p_instance->irq); nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); nrf_rtc_event_disable(p_instance->p_reg, mask); nrf_rtc_int_disable(p_instance->p_reg, mask); m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_UNINITIALIZED; NRFX_LOG_INFO("Uninitialized."); }
ret_code_t nrf_drv_rtc_cc_set(nrf_drv_rtc_t const * const p_instance, uint32_t channel, uint32_t val, bool enable_irq) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); ASSERT(channel<p_instance->cc_channel_count); uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg, int_mask); nrf_rtc_int_disable(p_instance->p_reg, int_mask); val = RTC_WRAP(val); if (m_cb[p_instance->instance_id].reliable) { nrf_rtc_cc_set(p_instance->p_reg,channel,val); uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); int32_t diff = cnt - val; if (cnt < val) { diff += RTC_COUNTER_COUNTER_Msk; } if (diff < m_cb[p_instance->instance_id].tick_latency) { return NRF_ERROR_TIMEOUT; } } else { nrf_rtc_cc_set(p_instance->p_reg,channel,val); } if (enable_irq) { nrf_rtc_event_clear(p_instance->p_reg,event); nrf_rtc_int_enable(p_instance->p_reg, int_mask); } nrf_rtc_event_enable(p_instance->p_reg,int_mask); return NRF_SUCCESS; }
ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32_t channel) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); ASSERT(channel<p_instance->cc_channel_count); uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); return NRF_ERROR_TIMEOUT; } } return NRF_SUCCESS; }
static void irq_handler(NRF_RTC_Type * p_reg, uint32_t instance_id, uint32_t channel_count) { uint32_t i; uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; for (i = 0; i < channel_count; i++) { if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) { nrf_rtc_event_disable(p_reg,int_mask); nrf_rtc_int_disable(p_reg,int_mask); nrf_rtc_event_clear(p_reg,event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id]((nrfx_rtc_int_type_t)i); } int_mask <<= 1; event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); } event = NRF_RTC_EVENT_TICK; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg, event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id](NRFX_RTC_INT_TICK); } event = NRF_RTC_EVENT_OVERFLOW; if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && nrf_rtc_event_pending(p_reg, event)) { nrf_rtc_event_clear(p_reg,event); NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); m_handlers[instance_id](NRFX_RTC_INT_OVERFLOW); } }
/** * * @brief Stop announcing sys ticks into the kernel * * This routine disables the RTC1 so that timer interrupts are no * longer delivered. * * @return N/A */ void sys_clock_disable(void) { unsigned int key; key = irq_lock(); irq_disable(NRF5_IRQ_RTC1_IRQn); nrf_rtc_event_disable(SYS_CLOCK_RTC, RTC_EVTENCLR_COMPARE0_Msk); nrf_rtc_int_disable(SYS_CLOCK_RTC, RTC_INTENCLR_COMPARE0_Msk); nrf_rtc_task_trigger(SYS_CLOCK_RTC, NRF_RTC_TASK_STOP); nrf_rtc_task_trigger(SYS_CLOCK_RTC, NRF_RTC_TASK_CLEAR); irq_unlock(key); /* TODO: turn off (release) 32 KHz clock source. * Turning off of 32 KHz clock source is not implemented in clock * driver. */ }
void nrfx_rtc_overflow_disable(nrfx_rtc_t const * const p_instance) { uint32_t mask = NRF_RTC_INT_OVERFLOW_MASK; nrf_rtc_event_disable(p_instance->p_reg, mask); nrf_rtc_int_disable(p_instance->p_reg, mask); }
void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) { /* * Implementation note: * * To help debugging the option configUSE_TICKLESS_IDLE_SIMPLE_DEBUG was presented. * This option would make sure that even if program execution was stopped inside * this function no more than expected number of ticks would be skipped. * * Normally RTC works all the time even if firmware execution was stopped * and that may lead to skipping too much of ticks. */ TickType_t enterTime; /* Make sure the SysTick reload value does not overflow the counter. */ if ( xExpectedIdleTime > portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) { xExpectedIdleTime = portNRF_RTC_MAXTICKS - configEXPECTED_IDLE_TIME_BEFORE_SLEEP; } /* Block the scheduler now */ portDISABLE_INTERRUPTS(); /* Configure CTC interrupt */ enterTime = nrf_rtc_counter_get(portNRF_RTC_REG); if ( eTaskConfirmSleepModeStatus() == eAbortSleep ) { portENABLE_INTERRUPTS(); } else { TickType_t xModifiableIdleTime; TickType_t wakeupTime = (enterTime + xExpectedIdleTime) & portNRF_RTC_MAXTICKS; /* Stop tick events */ nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); /* Configure CTC interrupt */ nrf_rtc_cc_set(portNRF_RTC_REG, 0, wakeupTime); nrf_rtc_event_clear(portNRF_RTC_REG, NRF_RTC_EVENT_COMPARE_0); nrf_rtc_int_enable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); __DSB(); /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can * set its parameter to 0 to indicate that its implementation contains * its own wait for interrupt or wait for event instruction, and so wfi * should not be executed again. However, the original expected idle * time variable must remain unmodified, so a copy is taken. */ xModifiableIdleTime = xExpectedIdleTime; configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); if ( xModifiableIdleTime > 0 ) { #ifdef SOFTDEVICE_PRESENT sd_app_evt_wait(); #else do{ __WFE(); } while (0 == (NVIC->ISPR[0])); #endif } configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_COMPARE0_MASK); portENABLE_INTERRUPTS(); /* Correct the system ticks */ portENTER_CRITICAL(); { TickType_t diff; TickType_t hwTicks = nrf_rtc_counter_get(portNRF_RTC_REG); nrf_rtc_event_clear(portNRF_RTC_REG, NRF_RTC_EVENT_TICK); nrf_rtc_int_enable (portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK); if(enterTime > hwTicks) { hwTicks += portNRF_RTC_MAXTICKS + 1U; } diff = (hwTicks - enterTime); if((configUSE_TICKLESS_IDLE_SIMPLE_DEBUG) && (diff > xExpectedIdleTime)) { diff = xExpectedIdleTime; } if (diff > 0) { vTaskStepTick(diff); } } portEXIT_CRITICAL(); } }