We have a working app for SDK 16 and freeRTOS. We wanted to update to SDK 17.0.2 but after upgrading the app hangs up at the first vTaskDelay(). We use configUSE_TICKLESS_IDLE 1. With the help of debugger I found out that the app enters endless loop in vPortSuppressTicksAndSleep(). It looks like the problem is that nrf_rtc_counter_get() always returns 0 and thus the time does not go forward. So the vTaskDelay() timeout never expires. I checked the changes between SDK 17.0.2 and the previous version and I found this two addition in sdk/modules/nrfx/drivers/src/nrfx_clock.c:
@@ -245,6 +245,9 @@ void nrfx_clock_lfclk_start(void) void nrfx_clock_lfclk_stop(void) { NRFX_ASSERT(m_clock_cb.module_initialized); + + nrf_clock_int_disable(NRF_CLOCK_INT_LF_STARTED_MASK); + nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED); nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTOP); while (nrf_clock_lf_is_running()) {} @@ -261,6 +264,9 @@ void nrfx_clock_hfclk_start(void) void nrfx_clock_hfclk_stop(void) { NRFX_ASSERT(m_clock_cb.module_initialized); + + nrf_clock_int_disable(NRF_CLOCK_INT_HF_STARTED_MASK); + nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTOP); while (nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY)) {}
Now if I remove those added lines disabling interrupt the app will work as normal.
Below is a minimal code to reproduce the problem. The a_task will hang up at first call to vTaskDelay().
My question: do we need to add some special handling for RTC to make it work? It worked with the previous SDK and I don't see any info about changes related to clock in release notes.
static void a_task(void *arg) { for (;;) { NRF_LOG_ERROR("a_task"); vTaskDelay(1000); } } int main() { NRF_LOG_INIT(xTaskGetTickCount); NRF_LOG_DEFAULT_BACKENDS_INIT(); app_timer_init(); nrf_drv_clock_init(); xTaskCreate(a_task, "a_task", 2048, NULL, pdTASK_PRIORITY_MAIN, NULL); vTaskStartScheduler(); APP_ERROR_CHECK_BOOL(false); }