cálculo de la pila en el microcontrolador

0

He escrito un programa para estimar el uso de la pila de la siguiente manera He definido una variable de puntero global para caracteres sin signo. He definido una variable local en el programa principal y he tomado la dirección de esta variable que será mi ubicación de pila inicial. En cada subrutina que vaya, definiré mi variable conocida y tomaré la dirección de esta variable. La diferencia entre La primera ubicación de la pila y la nueva ubicación de la pila serán de mi tamaño a partir de las cuales puedo calcular el tamaño máximo de la pila.

unsigned char *startingstacklocation;
unsigned char *endingstacklocation;
unsigned int maxstacksize; 

int main()
{
unsinged char mydefinedlocalvariable;
startingstacklocation = &mydefinedlocalvariable; 
subroutine1();
}

void subroutine1(void)
{
unsigned char existingvariables[20];
unsigned char mydefinedlocalvariable;

endingstacklocation = &mydefinedlocalvariable;
stacksize = endingstacklocation  - startingstacklocation;
if(stacksize > maxstacksize)
{
 maxstacksize = stacksize;
}
}

Mi pregunta es ¿la forma correcta de hacerlo?

    
pregunta rajesh

1 respuesta

3

Todo esto depende de su compilador, las opciones del compilador y el microcontrolador que está utilizando. puede ser una forma razonable de obtener una aproximación del uso de la pila, pero no será completamente precisa.

Si está ejecutando su código en un sistema operativo integrado, a menudo tendrá los punteros de pila para cada subproceso fácilmente accesible para que pueda leerlo directamente. Si está codificando esto en el "metal", entonces le sugiero que averigüe cómo leer el puntero de la pila directamente, escriba una rutina de código de ensamblaje para leerlo y use ese valor en sus cheques. Si está utilizando GCC, puede decirle al compilador que incruste esta comprobación al comienzo de la función cada automáticamente, utilizando la opción "funciones del instrumento".

La forma en que lo hago a menudo durante el desarrollo es asignar una gran cantidad de memoria para la pila y luego rellenarla con un patrón especial que es poco probable que aparezca en la pila. Después de que mi código se haya estado ejecutando, recorro esta área y busco hacia atrás hasta que alcancé el primer valor que no es mi patrón, y luego puedo estar bastante seguro de que esta es la pila más utilizada. Para que esto sea efectivo, debe ejercer todas las rutas de código durante las pruebas.

EDITAR: Ahora veo que asumes que la pila crece de una dirección baja a una dirección alta. Con frecuencia este no es el caso. En particular, no es cierto para su microcontrolador S12. La Sección 2.2.4 del S12CPUV2 Reference Manual menciona que crece "hacia abajo", lo que significa que comienza en una dirección más alta y se reduce a cero cuanto más se usa.

    
respondido por el pipe

Lea otras preguntas en las etiquetas