Rutina de servicio de interrupción en C: función en una dirección específica

Necesito agregar una rutina de servicio de interrupción (ISR) al código existente en C para un PIC18F4620 y un PIC18F46K22 . Como puede ver en la sección 9 (de ambas hojas de datos), estos dispositivos tienen múltiples vectores de interrupción: 0x0008para interrupciones de alta prioridad, 0x0018para interrupciones de baja prioridad.

Me gustaría tener una respuesta que sea útil en muchos casos, entonces la pregunta sería: ¿cómo puedo hacer una función en una dirección de memoria de programa específica? Para el ISR, esta dirección sería 0x0008o 0x0018.

Si sirve de algo, estoy usando el compilador MPLAB C18, v3.44.

Relacionado: Diseño de codificación C: ¿punteros de función?

Para el registro, no hay una forma genérica en C estándar para asignar código en una dirección específica. Debe usar formas específicas del compilador/enlazador, como #pragmas.

Respuestas (1)

Encontrará la información que necesita en el manual del compilador: GUÍA DEL USUARIO DEL COMPILADOR MPLAB C18 C.

De la página 37 de la guía del usuario:

MPLAB C18 no coloca automáticamente un ISR en el vector de interrupción. Comúnmente, GOTOse coloca una instrucción en el vector de interrupción para transferir el control al ISR propiamente dicho. Por ejemplo:

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

Al implementar una ISR de alta prioridad, no puede usar el interrupthighpragma como esperaría. Tendrá que usar el interruptpragma en su lugar, como se describe aquí .

Si puede cambiar el compilador: usar interrupciones es más fácil en los compiladores Microchip XC8 o HI-TECH PICC.

Tuve que copiar el código a mi proyecto de todos modos :-)