This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

What happens if handlers are called at the same time? (nrf51422)

Hi,

I am new to firmware engineering. I have a simple and basic question.

If there's Timer A and B, and both interval is 100ms, what happens to the timeout handler functions? If both timers start at the same time then also the predefined timeout handler functions will be called at every same, right? If it's right, how does nrf51422(s130) handle this situation? Does it runs only one handler? Or both?

define A_TIMER_INTERVAL APP_TIMER_TICKS(100,APP_TIMER_PRESCALER)

define B_TIMER_INTERVAL APP_TIMER_TICKS(100,APP_TIMER_PRESCALER)

APP_TIMER_DEF(A_timer_id);

APP_TIMER_DEF(B_timer_id);

static void A_timeout_handler(void * p_context) {/* some codes */}

static void B_timeout_handler(void * p_context) {/* some codes */}

app_timer_create(&A_timer_id,APP_TIMER_MODE_REPEATED,A_timeout_handler);

app_timer_create(&B_timer_id,APP_TIMER_MODE_REPEATED,B_timeout_handler);

app_timer_start(A_timer_id,A_TIMER_INTERVAL,NULL);

app_timer_start(B_timer_id,B_TIMER_INTERVAL,NULL);

Parents
  • In such scenario:

    A_timeout_handler will be called every 100ms - timer interval is counted between function calls.

    B_timer will be called also every 100ms but with 50ms offset to A_timeout_handler due to blocking time in A_timeout_handler.

    So at the end LED will be blinking every 100ms.

  • I strongly recommend to not do it like you proposed. If you will execute complicated_task_A and complicated_task_B inside handlers you will block other interrupts which are on the same or lower level. What you can do instead is for example:

    volatile bool flag_A = false;
    
     volatile bool flag_B = false;
    
    static void A_timeout_handler(void * p_context) {flag_A = true;}
    
    static void B_timeout_handler(void * p_context) {flag_b = true;}
    

    Next in your main loop:

    for (;;) {
    
    if (flag_A)
    
     {
    
         complicated_task_A();
    
         flag_A = false;
     
     }
    
    if (flag_B)
    
     {
    
         complicated_task_B();
    
         flag_B = false;
     
     }
    }
    

    It is not possible on 1 core to do it in the same time. However if task B is only to blink a LED (short task) you can leve it inside timout_handler. In such case when complicated_task_A(); is executed within a main loop B_timeout_handler can realize LED blink from interrupt context. It will look like both tasks are executed at the same time.

Reply
  • I strongly recommend to not do it like you proposed. If you will execute complicated_task_A and complicated_task_B inside handlers you will block other interrupts which are on the same or lower level. What you can do instead is for example:

    volatile bool flag_A = false;
    
     volatile bool flag_B = false;
    
    static void A_timeout_handler(void * p_context) {flag_A = true;}
    
    static void B_timeout_handler(void * p_context) {flag_b = true;}
    

    Next in your main loop:

    for (;;) {
    
    if (flag_A)
    
     {
    
         complicated_task_A();
    
         flag_A = false;
     
     }
    
    if (flag_B)
    
     {
    
         complicated_task_B();
    
         flag_B = false;
     
     }
    }
    

    It is not possible on 1 core to do it in the same time. However if task B is only to blink a LED (short task) you can leve it inside timout_handler. In such case when complicated_task_A(); is executed within a main loop B_timeout_handler can realize LED blink from interrupt context. It will look like both tasks are executed at the same time.

Children
No Data
Related