Application hangs after jumping to different application (RTC1_IRQHandler)

This is in regards to my last post here: https://devzone.nordicsemi.com/f/nordic-q-a/84016/switching-between-two-applications-using-nrf5-sdk

I am using FreeRTOS.

Both Application1 and Application2 have the same main:

int main(void)
{
	log_init();
	
    power_management_init();

    APP_ERROR_CHECK(nrf_drv_clock_init());

    sd_power_dcdc_mode_set(1);	//use DCDC function                                                                                                                                                                                                                                                                                                                                                                                                                                                            
	
    APP_ERROR_CHECK(nrf_drv_gpiote_init()); 
	
    create_task_handler();
    vTaskStartScheduler();          
}

The task that is spawned/created in create_task_handler(), in Application1, immediately jumps to Application2 when I called application_start (posted in previous post).

In Application2, when debugging, I see that main is executed immediately, however the breakpoint I set at the beginning of the task that is created in create_task_handler() doesn't get hit for ~25 seconds.  After about 25 seconds, the breakpoint in the created task is hit.

If I pause debugging during that 25 seconds, I see that the code is in the RTC1_IRQHandler which is xPortSysTickHandler.

I changed my application_start method to this in Application1

#include <nrf_rtc.h>

static void application_start(void)
{
    
    // Disable interrupts
    NVIC->ICER[0]=0xFFFFFFFF;
    NVIC->ICPR[0]=0xFFFFFFFF;
#if defined(__NRF_NVIC_ISER_COUNT) && __NRF_NVIC_ISER_COUNT == 2
    NVIC->ICER[1]=0xFFFFFFFF;
    NVIC->ICPR[1]=0xFFFFFFFF;
#endif

    nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK);
    NVIC_ClearPendingIRQ(portNRF_RTC_IRQn);
    
    sd_softdevice_vector_table_base_set(0x40000);

    app_start(0x40000);
    
}

Now my application immediately jumps and Application2 starts.

Is this the correct solution--disabling RTC interrupts and clearing it before jumping?  It appears to work now, but are there other interrupts I need to be wary of before jumping? 

I thought setting NVIC->ICER and NVIC->ICPR to 0xFFFFFFFF was disabling interrupts--why do I have to explicitly disable and clear the RTC interrupt?

  • I think because FreeRTOS uses the RTC (configTICK_SOURCE == FREERTOS_USE_RTC), it enables the RTC1_IRQHandler interrupts at startup, and because the RTC interrupt is pending it prevents me from jumping.  Does this sound correct?

    I'm assuming this is the only "setup" interrupt that is enabled since the SoftDevice isn't enabled until after the Application1 tries to jump to Application2.  SoftDevice is enabled in Application1 only if Application1 doesn't want to jump to Application2.

    I don't think FreeRTOS (out-of-the-box) enables any other interrupts during startup, but can anyone verify this?

  • Hi,

    I assume you still have the RTC running when you jump to the other application. I suggest stopping it before you jump to the other application.

    nrf_rtc_task_trigger(portNRF_RTC_REG, NRF_RTC_TASK_STOP);
    nrf_rtc_task_trigger(portNRF_RTC_REG, NRF_RTC_TASK_CLEAR);

    PS: If you run into any issues with the SD API calls, then you need to remember to enable forwarding of interrupts to the Softdevice by calling nrf_dfu_mbr_init_sd(). 

    Edit:

    The problem could be that RTC1->INTENSET = SYSTICK in the bootloader, and the app is started with this bit still set. So when FreeRTOS started up its scheduler, and enabled RTC1 IRQ, then SYSTICK interrupt would trigger in addition to COMPARE0. This line nrf_rtc_int_disable(portNRF_RTC_REG, NRF_RTC_INT_TICK_MASK), then fixed that.

Related