Pytanie:
Interrupt Service Routine in C - funkcja pod określonym adresem
user17592
2013-02-24 00:30:34 UTC
view on stackexchange narkive permalink

Muszę dodać procedurę obsługi przerwania (ISR) do istniejącego kodu w języku C dla PIC18F4620 i PIC18F46K22. Jak widać w sekcji 9 (obu arkuszy danych), te urządzenia mają wiele wektorów przerwań: 0x0008 dla przerwań o wysokim priorytecie, 0x0018 dla przerwań o niskim priorytecie.

Chciałbym mieć odpowiedź, która jest przydatna w wielu przypadkach, więc pytanie brzmiałoby: jak mogę utworzyć funkcję na określonym adresie pamięci programu? ISR, ten adres to 0x0008 lub 0x0018.

Jeśli jest to przydatne, używam kompilatora MPLAB C18 w wersji 3.44.

Powiązane: Projekt kodowania w C - wskaźniki funkcji?

Dla przypomnienia, w standardzie C nie ma ogólnego sposobu przydzielania kodu pod konkretny adres. Musisz użyć sposobów specyficznych dla kompilatora / linkera, takich jak #pragmas.
Jeden odpowiedź:
m.Alin
2013-02-24 00:51:03 UTC
view on stackexchange narkive permalink

Potrzebne informacje znajdziesz w instrukcji kompilatora: PODRĘCZNIK UŻYTKOWNIKA KOMPILERA MPLAB C18 C.

Od strony 37 podręcznika użytkownika:

MPLAB C18 nie umieszcza automatycznie ISR na wektorze przerwania. Zwykle instrukcja GOTO jest umieszczana w wektorze przerwania w celu przekazania sterowania do właściwego ISR. Na przykład:

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

Podczas implementacji ISR ​​o wysokim priorytecie, nie możesz użyć pragmy interrupthigh , jak byś się spodziewał . Będziesz musiał zamiast tego użyć pragmy przerwań , jak opisano tutaj.

Jeśli możesz zmienić kompilator: używanie przerwań jest łatwiejsze w Kompilatory Microchip XC8 lub HI-TECH PICC.

I tak musiałem skopiować kod do mojego projektu :-)


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...