¿Hay pila disponible en PIC ISRs?

2

Estoy tratando de entender mejor la interacción entre los bucles de primer plano (interrupción) y de fondo ( while (1) ) en un microcontrolador PIC. Específicamente, un PIC16F1709 usando XC8 v1.33. Esta documentación ayuda un poco, pero estoy más interesado en las cosas a nivel C (y menos hardware o ensamblaje).

Sé que no podemos devolver ni aceptar ningún parámetro, por lo que la única forma de interactuar con la interrupción es con una variable global o de nivel de módulo. ¿También es cierto que NO tenemos ninguna pila disponible para nosotros en un ISR? ¿Por lo tanto, no se pueden declarar las variables locales? ¿O se define la pila como la profundidad de las llamadas a funciones?

Mi uso de otra función MY_FIFO_Push (aunque sé mal para ISR), consumirá algo de pila para pasar las variables. No entiendo cómo funciona esto.

static volatile my_fifo_t my_fifo;

void MyIsr(void) {
  static uint8_t new_byte;

  // Grab a result from a hardware register
  new_byte = XXXRES;

  // Push the result onto a queue to be processed in background loop
  MY_FIFO_Push(&my_fifo, new_byte);

  // Clear the source of the interrupt
  XXXIF = 0;
}

...
void main(void) {

  while (1) {
    // Process the FIFO queue in the background loop
    // If there is new data on the queue
    //   Consume it
  }
}
    
pregunta tarabyte

2 respuestas

3

La mayoría de los micros PIC de 8 bits de Microchip tienen una pila de hardware con una profundidad de solo 8. (El tamaño variará para diferentes dispositivos PIC). Debido a que la profundidad de pila en estos micros es tan pequeña, se usa solo para llamadas a funciones. Cada llamada de función consumirá un nivel de la pila de hardware. El resto de las variables se insertan en una pila de software que es manejada automáticamente por el compilador.

Por lo tanto, tener una interrupción consumirá automáticamente 1 nivel de la pila. Por supuesto, puede tener variables declaradas en su interrupción, pero el compilador las insertará en la pila de software.

Su microcontrolador ( PIC16F1709 ) tiene una pila de hardware de 16 niveles, que es bastante buena profundidad En su código de muestra solo usa 2 niveles de la pila: uno para el ISR y otro para la llamada de la función MY_FIFO_Push del ISR. Así que te quedan 14 niveles más para llamadas de función anidadas.

Desde Sistemas embebidos / Microcontrolador PIC :

  

La pila PIC es un banco de registros dedicado (separado de   registros accesibles al programador) que solo se pueden utilizar para almacenar devoluciones   direcciones durante una llamada de función (o interrupción).

     

12 bits: un microcontrolador PIC con un núcleo de 12 bits (la primera generación   de los microcontroladores PIC) (incluidos la mayoría de los PIC10, algunos PIC12, algunos   PIC16) solo tiene 2 registros en su pila de hardware. Subrutinas en un   El programa PIC de 12 bits solo puede estar anidado a 2 profundidades, antes de la pila   desbordamientos, y los datos se pierden. Las personas que programan PIC de 12 bits pasan un   Mucho esfuerzo trabajando alrededor de esta limitación. (Estas personas son obligadas   confiar mucho en las técnicas que evitan el uso de la pila de hardware. por   ejemplo, macros, máquinas de estado y pilas de software). 14 bit: A PIC   El microcontrolador con un núcleo de 14 bits (la mayoría de PIC16) tiene 8 registros en el   pila de hardware. Esto hace que las llamadas a funciones sean mucho más fáciles de usar, incluso   aunque las personas que los programan deben ser conscientes de algunos restantes   gotchas [4]. 16 bits: un microcontrolador PIC con un núcleo de 16 bits (todos   PIC18) tiene una profundidad de pila de hardware de "nivel 31". Esto es mas que   Lo suficientemente profundo para la mayoría de los programas que la gente escribe. Muchos algoritmos que involucran   empujando datos a, luego, extrayendo datos de, algún tipo de pila.   Las personas que programan tales algoritmos en el PIC deben usar un   pila de software para datos (que recuerda a Forth). (Las personas que usan otros   Los microprocesadores a menudo comparten una sola pila para el retorno de ambas subrutinas.   direcciones y esta "pila de datos").

     

El análisis del árbol de llamadas se puede usar para encontrar la subrutina más profunda posible   Anidamiento utilizado por un programa. (A menos que el programa use w: recursion). Como   siempre que el anidamiento más profundo posible del programa "principal", más el   El anidamiento más profundo posible de las rutinas de interrupción, da una suma total   menor que el tamaño de la pila del microcontrolador en el que se ejecuta,   entonces todo funciona bien. Algunos compiladores hacen automáticamente tales   análisis del árbol de llamadas, y si la pila de hardware es insuficiente, el   el compilador cambia automáticamente a usar una "pila de software".   Los programadores en lenguaje ensamblador se ven obligados a hacer tal análisis a mano.

De desbordamiento de pila de PIC (si lee este artículo, es posible que no quiera usar los PIC en futuros proyectos. Sin embargo, no me ha detenido :-)):

  

Lo clave para entender acerca de la arquitectura PIC de 8 bits es que   El tamaño de la pila es fijo. Varía desde una profundidad de 2 para la realidad.   Dispositivos de gama baja a 31 para los dispositivos de 8 bits de gama alta. El más popular   las partes (como el 16F877) tienen un tamaño de pila de 8. Cada (r) llamada   consume un nivel, al igual que el manejador de interrupciones. Para añadir insulto a   lesión, si utiliza el depurador de circuito (ICD) en lugar de un completo   ICE soplado, entonces el soporte para el ICD también consume un nivel. Así que si usted   están utilizando una parte de la serie 16 (por ejemplo) con un ICD e interrupciones,   entonces tienes como máximo 6 niveles disponibles para ti. ¿Qué significa esto?   Bueno, si está programando en lenguaje ensamblador (que cuando obtiene   Hasta aquí siempre fue la intención de los diseñadores de PIC) significa   que puede anidar llamadas de función no más de seis de profundidad. Si usted es   Programar en C y luego dependiendo de tu compilador puede que ni siquiera estés   capaz de anidar funciones tan profundas, especialmente si está utilizando el tamaño   optimización.

    
respondido por el m.Alin
2

Los PIC de gama baja con los que he trabajado no proporcionan un indicador de pila o una forma conveniente de emular uno. Pero en realidad no necesita una pila en C si está dispuesto a renunciar a la función de re-ingreso de funciones. En este caso, el compilador puede asignar variables locales, argumentos de función y valores de retorno, como estadísticas y globales en la RAM ordinaria. Sé de al menos un compilador que funciona de esta manera.

    
respondido por el user28910

Lea otras preguntas en las etiquetas