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.