07.04.2013 Views

MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs ... - Microchip

MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs ... - Microchip

MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs ... - Microchip

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

16-Bit C <strong>Compiler</strong> User’s Guide<br />

8.5 INTERRUPT SERVICE ROUTINE CONTEXT SAVING<br />

8.6 LATENCY<br />

8.7 NESTING INTERRUPTS<br />

Interrupts, by their very nature, can occur at unpredictable times. There<strong>for</strong>e, the<br />

interrupted code must be able to resume with the same machine state that was present<br />

when the interrupt occurred.<br />

To properly h<strong>and</strong>le a return from interrupt, the setup (prologue) code <strong>for</strong> an ISR function<br />

automatically saves the compiler-managed working <strong>and</strong> special function registers on<br />

the stack <strong>for</strong> later restoration at the end of the ISR. You can use the optional save<br />

parameter of the interrupt attribute to specify additional variables <strong>and</strong> special<br />

function registers to be saved <strong>and</strong> restored.<br />

In certain applications, it may be necessary to insert assembly statements into the<br />

interrupt service routine immediately prior to the compiler-generated function prologue.<br />

For example, it may be required that a semaphore be incremented immediately on<br />

entry to an interrupt service routine. This can be done as follows:<br />

void<br />

__attribute__((__interrupt__(__preprologue__("inc _semaphore"))))<br />

isr0(void);<br />

There are two elements that affect the number of cycles between the time the interrupt<br />

source occurs <strong>and</strong> the execution of the first instruction of your ISR code. These are:<br />

• Processor Servicing of Interrupt – The amount of time it takes the processor to<br />

recognize the interrupt <strong>and</strong> branch to the first address of the interrupt vector. To<br />

determine this value refer to the processor data sheet <strong>for</strong> the specific processor<br />

<strong>and</strong> interrupt source being used.<br />

• ISR Code – The compiler saves the registers that it uses in the ISR. This includes<br />

the working registers <strong>and</strong> the RCOUNT special function register. Moreover, if the<br />

ISR calls an ordinary function, then the compiler will save all the working registers<br />

<strong>and</strong> RCOUNT, even if they are not all used explicitly in the ISR itself. This must be<br />

done, because the compiler cannot know, in general, which resources are used by<br />

the called function.<br />

The 16-bit devices support nested interrupts. Since processor resources are saved on<br />

the stack in an ISR, nested ISR’s are coded in just the same way as non-nested ones.<br />

Nested interrupts are enabled by clearing the NSTDIS (nested interrupt disable) bit in<br />

the INTCON1 register. Note that this is the default condition as the 16-bit device comes<br />

out of reset with nested interrupts enabled. Each interrupt source is assigned a priority<br />

in the Interrupt Priority Control registers (IPCn). If there is a pending Interrupt Request<br />

(IRQ) with a priority level equal to or greater than the current processor priority level in<br />

the Processor Status register (CPUPRI field in the ST register), an interrupt will be<br />

presented to the processor.<br />

DS51284H-page 112 © 2008 <strong>Microchip</strong> Technology Inc.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!