cómo escribir la función isr

1

He utilizado uart recibir utilizando el método de sondeo. Pero lo mismo quiero usar en ISR. ¿Cómo puedo escribir una función ISR. Por ejemplo, si estoy usando CC2541. En el manual, he visto que la tabla de vectores para el puerto 1 (donde está conectado UART) es P1INT_VECTOR. Pero no sé cómo escribir una función. Después de algunas búsquedas, encontré que muchas personas usaron una función como la que se muestra a continuación.

#pragma vector = P1INT_VECTOR
__interrupt void p0_ISR(void)
{
    /*Some statement*/
}

Pero no sé qué es p0_ISR. No vi esto en el manual o en la hoja de datos. Esta función de interrupción tiene algún prototipo ?. ¿Puede alguien ayudarme a entender esto? Para que pueda implementar en cada microcontrolador no solo CC2541

    
pregunta Reshmi khanna

2 respuestas

1

Las interrupciones no toman argumentos ni devuelven valores. Básicamente, es solo una subrutina simple que es 'llamada' por el hardware. Una señal de interrupción en el núcleo genera el equivalente a una instrucción de 'llamada' dondequiera que el procesador esté ejecutando un código, almacenando la dirección actual y luego saltando directamente al ISR.

Generalmente, una interrupción de UART tomará un byte del registro de recepción de UART y luego lo almacenará en un búfer de recepción global. Deberá tener cuidado con la forma en que accede al búfer de recepción global fuera del ISR, ya que es posible que el ISR se llame MIENTRAS que está actualizando los metadatos del búfer de recepción (punteros, contadores, etc.). Debe escribir un código que pueda manejar esto correctamente, ya sea asegurándose cuidadosamente de que el ISR no pueda pisotear la rutina de lectura o deshabilitando las interrupciones brevemente para evitar que el ISR se ejecute en momentos críticos. Hay técnicas de programación concurrente estándar que se pueden utilizar aquí.

En este repositorio hay un par de controladores UART controlados por interrupciones (algo complejos): enlace

    
respondido por el alex.forencich
0

P0_ISR () es el nombre de la función que se está definiendo. Su código va donde / * Alguna declaración * / es. El #pragma configura esa función para que sea llamada por la interrupción P1INT.

Las interrupciones no son parte del estándar C, por lo que son inherentemente específicas del hardware y del compilador. Por lo general, habrá una palabra clave o un pragma o ambos para indicar que la función es una interrupción. Por lo general, esto solo elimina parte del contexto normal de guardado y recarga, ya que la CPU lo manejará cuando regrese de la interrupción.

Para configurar el hardware para una interrupción, debe habilitar la interrupción en el periférico, habilitar (desenmascarar) la interrupción en la CPU y escribir la dirección ISR (o una instrucción de bifurcación) en la tabla de vectores. De nuevo, esto es específico del hardware. En su código, parece que podría haber alguna rutina de inicialización integrada que funcione con el #pragma para llenar la tabla vectorial.

    
respondido por el Adam Haun

Lea otras preguntas en las etiquetas