Skip to main content
gurnett2
Associate II
October 25, 2012
Question

changing irq handler

  • October 25, 2012
  • 4 replies
  • 1358 views
Posted on October 25, 2012 at 16:17

What is the best way to change the irqhandler to be used. I have a number of situations where the operations need to change depending on what the board is doing. Don't want to have a load of ifs or switches inside the isr, so my idea was to simply stop irq, change default handler and then resume. Is this possible?

Thanks

Michael
    This topic has been closed for replies.

    4 replies

    Tesla DeLorean
    Guru
    October 25, 2012
    Posted on October 25, 2012 at 17:03

    You'd need to place the vector table in RAM (512 byte boundary), or have multiple copies of the table in flash.

    You could also keep a function pointer, and have the routine call that, adding a single indirect jump.

    Using a switch/case or if-else-if construct wouldn't be that inefficient.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    gurnett2
    gurnett2Author
    Associate II
    October 25, 2012
    Posted on October 25, 2012 at 19:36

    Thanks for the answer clive1. Would I be correct that if it was you doing it you would go with the switch, if else option

    Thanks

    Michael

    Tesla DeLorean
    Guru
    October 25, 2012
    Posted on October 25, 2012 at 21:16

    If I have 4, or more, different behaviours I'd probably go with a switch/case

    For 2 or 3, the if/else

    void DMA2_Stream0_IRQHandler(void)
    {
    if (mode == 1)
    {
    /* Test on DMA Stream Half Transfer interrupt */
    if (DMA_GetITStatus(DMA2_Stream0, DMA_IT_HTIF0))
    {
    /* Clear DMA Stream Half Transfer interrupt pending bit */
    DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_HTIF0);
    // Process first half of sample buffer
    }
    /* Test on DMA Stream Transfer Complete interrupt */
    if (DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
    {
    /* Clear DMA Stream Transfer Complete interrupt pending bit */
    DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
    // Process second half of sample buffer
    }
    }
    else if (mode == 2)
    {
    // ..
    }
    else
    {
    // ..
    } 
    }

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    gurnett2
    gurnett2Author
    Associate II
    October 25, 2012
    Posted on October 25, 2012 at 21:21

    Thank you ever so much for your help.

    -Michael