Interrupt Service Routine in C - Funktion an bestimmter Adresse

Ich muss eine Interrupt Service Routine (ISR) zu bestehendem Code in C für einen PIC18F4620 und einen PIC18F46K22 hinzufügen . Wie Sie in Abschnitt 9 (beider Datenblätter) sehen können, haben diese Geräte mehrere Interrupt-Vektoren: 0x0008für Interrupts mit hoher Priorität, 0x0018für Interrupts mit niedriger Priorität.

Ich hätte gerne eine Antwort, die in vielen Fällen nützlich ist, also wäre die Frage: Wie kann ich eine Funktion an einer bestimmten Programmspeicheradresse ausführen? Für den ISR wäre diese Adresse 0x0008oder 0x0018.

Wenn es von Nutzen ist, verwende ich den MPLAB C18-Compiler, v3.44.

Verwandte: C-Codierungsdesign - Funktionszeiger?

Für den Datensatz gibt es in Standard-C keine generische Möglichkeit, Code einer bestimmten Adresse zuzuweisen. Sie müssen Compiler-/Linker-spezifische Methoden wie #pragmas verwenden.

Antworten (1)

Die benötigten Informationen finden Sie im Compiler-Handbuch: MPLAB C18 C COMPILER USER'S GUIDE .

Ab Seite 37 der Bedienungsanleitung:

MPLAB C18 platziert nicht automatisch eine ISR am Interrupt-Vektor. Üblicherweise GOTOwird am Unterbrechungsvektor eine Anweisung platziert, um die Steuerung an die eigentliche ISR zu übertragen. Zum Beispiel:

void lowPriorityISR(void);

#pragma code low_vector=0x18
void interrupt_at_low_vector(void) { 
    _asm GOTO lowPriorityISR _endasm 
}
#pragma code

#pragma interruptlow lowPriorityISR
void lowPriorityISR() {
}

Wenn Sie eine ISR mit hoher Priorität implementieren, können Sie das interrupthighPragma nicht wie erwartet verwenden. Sie müssen stattdessen das interruptPragma verwenden, wie es hier beschrieben wird .

Wenn Sie den Compiler ändern können: Die Verwendung von Interrupts ist in den Microchip XC8- oder HI-TECH PICC-Compilern einfacher.

Musste den Code sowieso in mein Projekt kopieren :-)