Domanda:
Routine di servizio di interrupt in C - funzione a un indirizzo specifico
user17592
2013-02-24 00:30:34 UTC
view on stackexchange narkive permalink

Devo aggiungere una Interrupt Service Routine (ISR) al codice esistente in C per un PIC18F4620 e un PIC18F46K22. Come puoi vedere nella sezione 9 (di entrambi i fogli dati), questi dispositivi hanno più vettori di interrupt: 0x0008 per interrupt ad alta priorità, 0x0018 per interrupt a bassa priorità.

Mi piacerebbe avere una risposta che sia utile in molti casi, quindi la domanda sarebbe: come posso creare una funzione su uno specifico indirizzo di memoria del programma? ISR, questo indirizzo sarebbe 0x0008 o 0x0018.

Se serve, sto usando il compilatore MPLAB C18, v3.44.

Correlati: progettazione della codifica C - puntatori a funzioni?

Per la cronaca, non esiste un modo generico nello standard C per allocare il codice a un indirizzo specifico. Devi usare modi specifici del compilatore / linker, come #pragmas.
Una risposta:
m.Alin
2013-02-24 00:51:03 UTC
view on stackexchange narkive permalink

Troverai le informazioni di cui hai bisogno nel manuale del compilatore: GUIDA DELL'UTENTE DEL COMPILATORE MPLAB C18 C.

Da pagina 37 della guida dell'utente:

MPLAB C18 non pone automaticamente un ISR al vettore di interrupt. Comunemente, un'istruzione GOTO viene posta nel vettore di interrupt per trasferire il controllo all'ISR corretto. Ad esempio:

  void lowPriorityISR (void); # pragma code low_vector = 0x18void interrupt_at_low_vector (void) {_asm GOTO lowPriorityISR _endasm} #pragma code # pragma interruptlow lowPriorityISRvoid lowPriorityISRvoid }  

Quando si implementa un ISR con priorità alta , non è possibile utilizzare il pragma interrupthigh come ci si aspetterebbe . Dovrai invece usare il pragma interrupt , come descritto qui.

Se puoi cambiare il compilatore: usare gli interrupt è più facile nel Compilatori Microchip XC8 o HI-TECH PICC.

Ho comunque dovuto copiare il codice nel mio progetto :-)


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...