Durante pruebas de temporización del bucle principal, se observó un fenómeno inesperado: al agregar sentencias aparentemente irrelevantes durante la inicialización sin modificar el bucle principal, los tiempos medidos variaron significativamente.
Detalles de la observación
Fragmento de código en análisis
while(1)
{
__disable_irq();
Toggle_Led(Red);
Retardo_Generico();
Toggle_Led(Green);
Retardo_Generico();
Toggle_Led(Blue);
Retardo_Generico();
__enable_irq();
}
</div>### Función de retardo modificada
<div>```
static void Retardo_Generico(void)
{
uint32_t contador;
for(contador = 0; contador < TAMANO_BUFFER; contador++)
{
Buffer_Transmision[contador] = (uint8_t)(contador & 0xFF);
}
}
Esta sección representa código de inicialización que puede ser parcialmente comentado para modificar la longitud total del programa:
Configurar_Pines_GPIO(); Inicializar_Comunicacion_Serial();
/**
- @brief Función de configuración DMA
- @note Al comentar esta sección se modifica la posición en memoria
-
de las funciones posteriores
*/ Configurar_DMA_Comunicacion();
</div>### Fenómeno observado
La función `Configurar_DMA_Comunicacion` actúa como código de rellleno que puede eliminarse. Al mantener sus tres líneas de código, el temporizador del sistema registró un ciclo de **960,294** pulsos. Al reducirlo a una sola línea, el valor cambió a **1,140,280** pulsos. Esta diferencia del 18.7% demuestra que la posición del código en memoria afecta directamente el tiempo de ejecución.
Análisis técnico
----------------
Al examinar el código ensamblador de la función de retardo, se observó que el contenido de las instrucciones no variaba entre ambas configuraciones. El único cambio era la dirección de memoria donde residía las instrucciones.
Este fenómeno se debe a la arquitectura de acceso a memoria flash del microcontrolador. La velocidad de ejecución puede verse afectada por factores como:
- Alineación de instrcuciones en bloques de lectura de flash
- Efectos de caché de instrucciones
- Tiempo de espera de acceso a diferentes regiones de memoria
Se realizó una prueba adicional añadiendo progresivamente código después de la función de configuración DMA. Los tiempos medidos alternaron cíclicamente entre los dos valores observados, confirmando que la posición física del código en memoria es el factor determinante.
Conclusión técnica
------------------
La posición exacta del código en la memoria flash del microcontrolador STM32 puede alterar significativamente el tiempo de ejecución, incluso cuando las instrucciones idénticas se ejecutan. Este comportamiento es inherente a la arquitectura del sistema y debe considerarse durante el desarrollo de aplicaciones con restricciones temporales estrictas.
Se requiere análisis adicional mediante herramientas de depuración de hardware precisas para determinar qué instrucciones específicas dentro de la función de retardo son más sensibles a estos cambios de posición de memoria.
</div>