FreeRTOS / AVR32UC3A - Reassigning ISRs

sm92 wrote on Thursday, March 06, 2008:

I’m writing an application using FreeRTOS on the AVR32UC3A,.

Due to timing and hardware constraints, I have to reassign interrupt vectors periodically in the code.

For example, I will register a timer interrupt to ISR0, run some code that will trigger ISR0 a bunch, stop the timer, then re-register the timer interrupt to ISR1, and run code that will then trigger ISR1. (I also do the same thing with an interrupt on a GPIO pin).

This part of the code works fine, however, after doing this, I will get exceptions such as illegal opcode, data bus read error, bus error, etc.

I strongly suspect that reassigning the interrupts (using INTC_register_interrupt, exactly as they were registered in the first place) is what is causing these exceptions, because the when this part of the code is commented out, everything works perfectly.

Is it allowed to re-assign interrupts as I have been doing? Do they need to be “de-registered” first? I’ve searched all of Atmel’s and FreeRTOS’s documentation, and haven’t been able to find anything that touches on this issue.


davedoors wrote on Friday, March 07, 2008:

Do you disable interrupts while you make the reassignment?

sm92 wrote on Friday, March 07, 2008:

Yes, interrupts are disabled when I reassign the ISRs.