STM32 Capítulo 2 - Iniciar el proceso se detalla

proceso de arranque STM32, los medios de proceso de arranque ejecuta las primeras aperturas instrucción de restablecimiento (archivo compilado) de la CPU para entrar en la función de programa principal C entre una porción de entrada (). El proceso de arranque es relativamente importante, aunque difícil, pero debe entender el.

1. Las diferentes series de distinto código arranque de viruta.
2. Iniciar el proceso se realiza principalmente:
Aquí Insertar imagen Descripción
3. Abra su proyecto, haga doble clic en el archivo de proyecto. .Out archivo va a salir para ver la lista de vectores de interrupción correspondiente almacenado en la memoria flash interna.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
4. La secuencia de restablecimiento
después de un reinicio de hardware, después de pulsar el botón de reinicio. circuito lógico secuencial dentro de los primeros realiza CPU los dos siguiente operación (Códigos de programa a una ejemplo flash interna, parpadeará primera dirección 0x0800 0000)

  • La dirección de la posición 0x08000000 almacenamiento almacena en la SP pila en la pila (MSP).
  • La dirección de vector de posición 0x08000004 de almacenamiento en el contador de programa PC.
    Sacar de la dirección física de los puntos de registro de la CPU del PC a la primera instrucción de la ejecución del programa, que es el inicio de una rutina de servicio de interrupción Reset_Handler reinicio. Restablecer rutina de servicio de interrupción llama a la función SystemInit () para configurar el reloj del sistema dispuesto bus SRAM / SDRAM externa en la FMC, y luego saltar a las funciones de biblioteca C __main. Hecho por las funciones de biblioteca C __main inicialización del programa de usuario (por ejemplo: valores iniciales variables, etc.), las funciones escritos por el usuario última llamada __main por los principales aperturas () la función de ejecución del programa C.

Antes de aprender primera mirada archivo de inicio en algunas instrucciones en lenguaje ensamblador.
instrucciones de montaje de brazo de inicio Resumen archivos

análisis de código específica

La primera parte del análisis de código
siguientes implementos de código abierto pila espacio (Stack) para las variables locales, llamadas de función, parámetros de función.

pila de acción para las variables locales, llamadas de función, por lo que el parámetro de la función de coste, el tamaño de la pila no puede exceder el tamaño de la SRAM interna. Si la programación es relativamente grande, un montón de variables locales definidas, entonces resulta necesario modificar el tamaño de la pila. Si un día, se escribe el programa parecía extraño error inexplicable, y entra en un fallo dificultades, entonces el siguiente usted tiene que considerar si la pila no es lo suficientemente grande, se desbordó.
Aquí Insertar imagen Descripción
. Línea 7 : directiva EQU es una definición de macro, similar al lenguaje C # define . Directiva se entiende la "instrucción" no genera un código binario, no hará que la asignación de espacio variable. 0x00008000 expresó tamaño de la pila, prestar atención a que aquí se expresa en bytes. 0x00008000 = 32768 bytes = 32 KB

Línea 8 : un espacio abierto de lectura y escritura de datos, segmentos nombre de pila, alineados en 8 bytes. Directiva arer indica comenzará a definir un segmento de código o segmento de datos. Aquí está la definición del segmento de datos. Arer después de la palabra clave indica que el segmento de propiedad.

  • PILA: representa el nombre de esta sección, puede ser identificado.
  • NOINIT: Indica el segmento de datos inicial no tiene que rellenar.
  • READWRITE: Esta sección representa una lectura y escritura.
  • ALIGN = 3: 3 representa la primera dirección de acuerdo con el poder alineada de 2, es decir, de acuerdo con la 8-byte alineado (a la dirección 8 I logarítmicamente igual a 0).

. Línea 9 : el ESPACIO decir la línea de instrucción ensamblador 0x00000800 bytes asignados a los segmentos de espacio de pila de memoria contigua.

Línea 10 : __initial_sp colocan inmediatamente comunicado ESPACIO indicando la parte superior de la dirección de pila. __initial_sp sólo una etiqueta, una etiqueta se utiliza principalmente para indicar una ubicación de espacio de memoria, lo que equivale a "dirección" el concepto del lenguaje C. Simplemente indica un espacio de memoria dirección de posición, desde el punto de vista del lenguaje C, la dirección de la variable, o una función de la dirección de entrada de la matriz de direcciones no es diferente en la naturaleza.

La segunda parte del análisis de código
siguiente de código abierto implementa espacio de montón (heap) , se utiliza principalmente para la asignación de memoria dinámica, como una función de la distribución espacial de la variable de malloc, calloc, realloc y similares son en el montón.
Aquí Insertar imagen Descripción
Estas líneas y la primera parte de la instrucción de código similar a la anterior. Asignar un espacio de memoria contiguo para el nombre de la sección de HEAP, que se asigna espacio de montón. el tamaño de acumulación es 0x00000400, que es 1.024 bytes = 1 KB.
__heap_base dirección de inicio del montón.
__heap_limit indica la dirección final de la pila.

Código parte de análisis 3
Aquí Insertar imagen Descripción
, línea 24 : PRESERVE8 para el archivo actual que sostiene la pila de 8 bytes alineados .
Línea 25 : indica que la siguiente instrucción es un conjunto Thumb, CM4 se utiliza PULGAR - conjunto de instrucciones 2.
Línea 29 : ZONA definir un segmento de código, de sólo lectura nombre de segmento se pone a cero. READONLY de sólo lectura, la sección de código por defecto dice.
30-32 filas : 3 líneas del extracto EXPORTACIÓN tres etiquetas pueden ser declarados como referencias externas, principalmente al enlazador utilizado para archivos de biblioteca de vínculos u otros documentos. Cuando el núcleo en respuesta a la ocurrencia de una anormalidad, se ejecuta la rutina de servicio de excepción correspondiente (ESR). Con el fin de determinar la dirección de la entrada de ESR, los usos del kernel - ‖ mecanismo de consulta de tabla de vectores. Aquí el uso de una tabla de vectores. La tabla de vectores es en realidad una matriz WORD (32 bits enteros), cada uno correspondiente a un índice inusual, menor es el valor de la entrada de elemento ESR estándar de la
dirección. tabla de vectores en los lugares de espacio de direcciones se puede configurar para indicar al NVIC por una reubicación registro
Escala de direcciones. Después del reinicio, este registro es cero. Por lo tanto, la dirección 0 (es decir, dirección FLASH 0), el paquete debe
contener una tabla de vectores, una anormalidad en la asignación inicial. Tenga en cuenta que aquí hay una alternativa: no un tipo 0
dirección de entrada, pero da el valor inicial del MSP después de un reinicio.

Parte 4 de análisis de código
Aquí Insertar imagen Descripción
Tabla vectorial
por encima de este código es establecer la tabla de vectores de interrupción, la tabla de vectores de interrupción está colocado en la parte delantera del código. dirección física particular se determina por los parámetros de configuración enlazador (dirección IROM1). Si el programa se ejecuta en Flash, la dirección de la tabla de vectores a partir de interrupción es 0x08000000. En el ejemplo MDK, es una opción de configuración:
Aquí Insertar imagen Descripción
la DCD representa una asignación de espacio de 4 bytes. Cada fila DCD genera un código binario de 4 bytes. tabla de vectores de interrupción
almacenada en la dirección de entrada es en realidad la rutina de servicio de interrupción. Cuando se produce una excepción (es decir, un evento de interrupción), interrupción de la CPU sistema establecerá la dirección de entrada adecuada asignado al contador de programa PC y, a continuación, comenzaron a ejecutar la rutina de servicio de interrupción.

Parte de análisis 5 de código de
Aquí Insertar imagen Descripción
la línea 53 es : una definición de los segmentos de código de área, de sólo lectura nombre de segmento es .text. READONLY de sólo lectura.
Línea 56 : usando PROC, ENDP la directiva de este bloque se divide en una pluralidad de procesos, de manera que la estructura del programa más claro.
57ª fila : otros estados débiles de la misma etiqueta del nombre tiene prioridad sobre la etiqueta se hace referencia, es decir, si se declara el exterior, entonces se dice en voz alta. Esta declaración es importante porque nos permite colocar en cualquier lugar en la rutina de servicio de interrupción en el archivo C, siempre y cuando el nombre de la función C y consistencia al nombre de la tabla de vectores.
Línea 58 : IMPORTACIÓN: número de referencia utilizado para informar a la directiva del compilador a utilizar se define en algunos otros archivos de origen. Sin embargo, para citar en el archivo de fuente de corriente, y con independencia del archivo fuente de corriente se hace referencia a la etiqueta, se añadirá la etiqueta de la tabla de símbolos del archivo fuente de corriente.
Línea 61 es : SystemInit () es una función de la biblioteca estándar, en la definición general system_stm32f4xx.c esta biblioteca. Después de que la función principal es establecer el reloj del sistema llamada esta función aquí, F429 función de reloj del sistema está configurado para 180M.
línea 63: __ principales números de entrada denotan direcciones funciones / C ++ biblioteca estándar C en una rutina de inicialización en tiempo real a __main. Un papel importante de este programa es para inicializar la pila e inicializar el archivo de imagen, y, finalmente, pasar a la función principal en un programa C. Esto explica por qué todos los programas del C debe tener una función principal como punto de partida para el programa. Ya que está reglamentado por la biblioteca estándar de C / C ++ en tiempo real, y no puede ser cambiado. Si no estamos aquí para llamar __main, en última instancia, el programa no llamaría a nuestro fichero C dentro de la principal, si se trata de usuarios molestos pueden cambiar el nombre de la función principal, entonces no importar se escribe el nombre de la función principal. Esta vez se escribe en archivos de C en el interior del nombre de la función principal no es la principal, pero el __main.
LDR, BLX, instrucción BX es CM4 núcleo:
El comando del núcleo

Parte 6 de análisis de código
Aquí Insertar imagen Descripción
, línea 71 : bucle infinito, donde los usuarios pueden implementar su propia rutina de servicio de interrupción. Pero pocos aquí darse cuenta de la rutina de servicio de interrupción, y más en general del mismo nombre es una rutina de servicio de interrupción re-escritura en otros archivos de C en el interior, ya que es débil SEMANA definido. Si usted no escribe programa de servidor de interrupción en otro archivo, y esta interrupción está habilitada entra aquí, el programa atrapado en este lugar.
Línea 81 : por defecto rutina de servicio de interrupción (inicio)
línea 92: bucle infinito, si el usuario active la rutina de servicio de interrupción, pero no escribió la rutina de servicio de interrupción en el archivo de C que luego el usuario introduce aquí. Por ejemplo, en un programa que permitió al puerto serie 1 de interrupción, pero no escribió una ART1_IRQHandle rutina de servicio de interrupción, entonces el puerto interrupción de serie, y que entrará en este bucle sin fin.
Línea 94 : rutina de servicio de interrupción por defecto (final).

Parte de análisis de código 7
última parte del código de inicio: Aquí Insertar imagen Descripción
Línea 101 : simple lenguaje ensamblador SI ...... ............ .ELSE comunicado. Si define MICROLIB, entonces el programa no se ejecutará la rama ELSE código. __MICROLIB y no pueden ser familiares, que se encuentra en el interior Opción MDK destino.
Aquí Insertar imagen Descripción
Extraño, entonces este paso es el trabajo de configuración es muy importante, muchas personas no tendrán la función printf serie, el compilador tiene problemas, problemas de descarga, esto es los pasos de configuración erróneos. Objetivo seleccionado en el micro-biblioteca "Uso MicroLib", como es en la preparación de futuro controlador de puerto serie puede utilizar la función printf. Y algunas aplicaciones si la unidad de coma flotante FPU STM32, debemos biblioteca micro también está abierto, o, a veces todo tipo de fenómenos extraños. FPU opciones de configuración final de carrera en las opciones de la micro-biblioteca "Uso de precisión simple", el valor por defecto está activada.

Publicado 33 artículos originales · ganado elogios 21 · vistas 8914

Supongo que te gusta

Origin blog.csdn.net/qq_39400113/article/details/105056538
Recomendado
Clasificación