17.01.2015 Views

QDK PIC24/dsPIC-XC16 - Quantum Leaps

QDK PIC24/dsPIC-XC16 - Quantum Leaps

QDK PIC24/dsPIC-XC16 - Quantum Leaps

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>QDK</strong><br />

<strong>PIC24</strong>/<strong>dsPIC</strong>-<strong>XC16</strong><br />

www.state-machine.com/pic<br />

"and.w w0,#7,w0 \n" \<br />

"mov.w #1,w1 \n" \<br />

"sl w1,w0,w0 \n" \<br />

"ior.b #1,w0 \n" \<br />

"com.b w0,w0 \n" \<br />

"disi #0x3FFF \n" \<br />

"and.b _QK_intNest_" : "=r"(this_sr) : : "w0", "w1"); \<br />

if (QK_intNest_ == 0) { \<br />

uint8_t p = QK_schedPrio_(); \<br />

if (p != (uint8_t)0) { \<br />

__asm__ volatile ("clr.b SR"); \<br />

QK_sched_(p); \<br />

__asm__ volatile ("mov.w %0,SR" : : "r"(this_sr)); \<br />

} \<br />

} \<br />

__asm__ volatile ("disi #0x0000"); \<br />

} while (0);<br />

#include "qk.h" /* QK platform-independent public interface */<br />

(1) The macro QK_ISR() defines the ISR attributes, as required by the <strong>XC16</strong> compiler. The macro is<br />

designed to be before the actual ISR signature, as will be illustrated in Listing 8. The argument psv_<br />

controls PSV usage in the ISR and can be either auto_psv or no_auto_psv (see Section 3.3.1).<br />

(2) The macro QK_ISR() then uses the attribute __preprologue__ to define the specific interrupt entry<br />

sequence in assembly, which the compiler copies verbatim before any generated ISR code.<br />

(3) The macro QK_ISR_EXIT() must be invoked as the last instruction of every ISR of IPL 1..6. Again,<br />

the usage of this macro will be illustrated in Listing 8.<br />

4.2 ISRs with the Preemptive QK Kernel<br />

Even though the QK interrupt entry/exit macros are somewhat involved, their use is actually very simple<br />

and enables very straightforward coding ISRs in C, without any need to use assembly. The following<br />

Listing 8 shows how to write ISRs for the preemptive QK kernel:<br />

NOTE: The QK interrupt entry and exit macros QK_ISR() and QK_ISR_EXIT() work only with the<br />

optimization level O1 or higher (O2, O3, or Os) in the <strong>XC16</strong> compiler. The MPLABX <strong>XC16</strong> compiler<br />

will report a compile-time error “'asm' operand requires impossible reload” when no optimization is<br />

used.<br />

Listing 8: T2Interrupt ISR for QK<br />

(1) QK_ISR(no_auto_psv) _T2Interrupt() {<br />

_T2IF = 0; /* clear Timer 2 interrupt flag */<br />

#ifdef Q_SPY<br />

(2) l_tickTime += BSP_TMR2_PERIOD; /* account for TMR2 overflow */<br />

#endif<br />

QF_TICK(&l_T2Interrupt); /* handle all armed time events in QF */<br />

(3) QK_ISR_EXIT(); /* inform QK about exiting the ISR */<br />

}<br />

Copyright © <strong>Quantum</strong> <strong>Leaps</strong>, LLC. All Rights Reserved.<br />

19 of 35

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

Saved successfully!

Ooh no, something went wrong!