Подпрограмма обслуживания прерываний в C - функция по определенному адресу

Мне нужно добавить подпрограмму обслуживания прерываний (ISR) в существующий код на C для PIC18F4620 и PIC18F46K22 . Как видно из раздела 9 (обоих таблиц), эти устройства имеют несколько векторов прерываний: 0x0008для прерываний с высоким приоритетом, 0x0018для прерываний с низким приоритетом.

Я хотел бы получить ответ, который полезен во многих случаях, поэтому вопрос будет таким: как я могу сделать функцию для определенного адреса памяти программы? Для ISR этот адрес будет 0x0008или 0x0018.

Если это поможет, я использую компилятор MPLAB C18 версии 3.44.

Связанный: Дизайн кодирования C - указатели функций?

Для справки, в стандарте C нет общего способа размещения кода по определенному адресу. Вы должны использовать специфичные для компилятора/компоновщика способы, такие как #pragmas.

Ответы (1)

Необходимую информацию вы найдете в руководстве по компилятору: MPLAB C18 C COMPILER USER'S GUIDE .

Со страницы 37 руководства пользователя:

MPLAB C18 не размещает автоматически ISR в векторе прерывания. Обычно GOTOв вектор прерывания помещается инструкция для передачи управления собственно ISR. Например:

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() {
}

При реализации ISR с высоким приоритетом вы не можете использовать эту interrupthighпрагму так, как ожидали. Вместо этого вам придется использовать interruptпрагму, как описано здесь .

Если вы можете изменить компилятор: использование прерываний проще в компиляторах Microchip XC8 или HI-TECH PICC.

Все равно пришлось скопировать код в свой проект :-)