AVR32 IRQ Handling

I’ve upgraded my Atmel UC3A0512 project to FreeRtos V5.0.2. My question regards interrupt handling when the ISR might awaken a different thread due to the ISR placing a message into a queue. The serial ISR example, which does exactly that, looks like this. The 2nd function, TerminalIsr() is the one that’s actually called when an IRQ occurs: __attribute__((__noinline__)) static portBASE_TYPE TerminalIsrHandler( void ) {     char                                     Byte;     unsigned long                 Status;     unsigned long                        IrqSource;     portBASE_TYPE                     Qstatus;     portBASE_TYPE                     HigherPriorityTaskWoken = pdFALSE;     Code That Does Stuff Goes Here…     /* The return value will be used by portEXIT_SWITCHING_ISR() to know if it     should perform a taskYIELD_FROM_ISR(). Note that the macro explicitly     checks for a 1 in order to do the yield operation. */     return (HigherPriorityTaskWoken ? 1 : 0); } // Terminal interrupt service routine. // Since we might switch tasks inside here, we have to give it the ‘naked’ // attribute rather than ‘interrupt’ and handle the stack via // portENTER_SWITCHING_ISR & portEXIT_SWITCHING_ISR. // In addition, because FreeRTOS is not supposed to run with nested // interrupts, put all OS calls in a critical section. __attribute__((__naked__)) static void TerminalIsr( void ) {     /* This ISR can cause a context switch, so the first statement must be a     call to the portENTER_SWITCHING_ISR() macro.  This must be BEFORE any     variable declarations. */     portENTER_SWITCHING_ISR();         // Now go do the work     TerminalIsrHandler();                    /* Exit the ISR.  If a task was woken by either a character being received     or transmitted then a context switch will occur. */     portEXIT_SWITCHING_ISR(); } My question is – Can I write a single function that handles ISRs rather than incurring the overhead of a 2nd function call? If so, what would the template be for that function? Thanks !

AVR32 IRQ Handling

I’ve dug a little deeper. The IRQ I need to do extra work is the OS Timer tick ISR which uses     portSAVE_CONTEXT_OS_INT() and portRESTORE_CONTEXT_OS_INT() and is structurally different than the serial port example I outlined earlier. So, let’s change my question. I can define configUSE_TICK_HOOK to 1 to force the tick ISR to call out to my code. The question is, how do I in the hook routine post data into a queue – a "normal" queue, not a co-routine queue. I’m not using co-routines.

AVR32 IRQ Handling

Since I’m about to write another serial port handler, I guess I’d still like my first question answered as well. Thanks again!