PIC18: service multiple interrupts

paul_piak wrote on Tuesday, January 09, 2007:


Since the PIC18 is pretty low-end, I like to make the code as efficient as possible.

The situation is as follows:
I usually use interrupts for i2c or serial communication, so typically I call xQueueReceiveFromISR and xQueueSendFromISR, which take relatively long to execute.
It is therefore quite likely that during handling of 1 interrupt, another interrupt fires.
In the PIC18 port, only 1 interrupt flag will be serviced every entry into the interrupt handler, each calling portSAVE_CONTEXT and portRESTORE_CONFIG.
I counted the number of instructions for a portSAVE_CONTEXT, which is about 100.
A portRESTORE_CONFIG takes the same amount of cycles. This is a lot of overhead.

I would like to move the calls to portSAVE_CONTEXT and portRESTORE_CONFIG from the interrupt functions to the interrupt handler prvLowInterrupt in port.c, so that portSAVE_CONTEXT is called once, all interrupts are served, forcing taskswitches etc. until the global interrupt flag drops (no interrupts to be served any more), (maybe even only 1 final ‘yield’?)  and then portRESTORE_CONFIG is called
My question is: Is there a fundamental problem with this? For example: is it possible to have the wrong task activated after this?