proceso - ¿Cuál es la función de los archivos.s en un proyecto de C?
guardar y leer datos en un archivo.txt en c (3)
La extensión .s es la convención utilizada por GNU y muchas otras cadenas de herramientas para archivos de ensambladores.
La última vez que busqué, la Biblioteca Periférica Estándar de STM32 no contiene archivos de ensamblador, sin embargo, la biblioteca CMSIS contiene código de inicio para varias partes de STM32, por ejemplo startup_stm32f2xx.s es el código de inicio para todos los dispositivos de la serie STM32F2xx. Existen diferentes implementaciones para diferentes cadenas de herramientas; necesita compilar y vincular el archivo asociado con su pieza específica y cadena de herramientas. Si está utilizando un proyecto de ejemplo que genera y ejecuta o un IDE que crea proyectos específicos para cada parte, probablemente ya se habrá hecho, si tiene un código que lo ejecuta, ciertamente lo ha hecho.
La forma en que construya y vincule el código dependerá de la cadena de herramientas que esté utilizando. La mayoría de las herramientas basadas en IDE reconocerán automáticamente la extensión e invocarán al ensamblador para generar un archivo de objeto que se vinculará como cualquier otro. El contenido exacto difiere ligeramente entre las versiones de la cadena de herramientas, pero crea principalmente el entorno de tiempo de ejecución de C (pila y pila), inicializa el procesador, define una tabla de vector de interrupciones / excepciones iniciales, inicializa datos estáticos y salta a main ().
El núcleo del archivo para la versión Keil / ARM RealView, por ejemplo, se ve así:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Reset_Handler
es el Reset_Handler
del contador de programa (PC) de la dirección que se establecerá después de un restablecimiento del procesador.
SystemInit
es una función de código C externa que realiza la mayor parte de la inicialización; esto puede necesitar personalización para su hardware. Cortex-M es inusual porque puede comenzar a ejecutar el código C inmediatamente después del restablecimiento porque la tabla vectorial incluye tanto la dirección de restablecimiento como la dirección del puntero de pila inicial, que se carga automáticamente en el registro SP en el restablecimiento. Como resultado, no necesita mucho conocimiento del ensamblador para que se ejecute uno.
__main()
es el punto de entrada provisto por el compilador para su código C. No es la función main () que escribe, pero realiza la inicialización de la biblioteca estándar, los datos estáticos, el montón antes de llamar a su función `main () ''.
La versión de GCC es algo más complicada, ya que realiza gran parte del trabajo realizado por __main()
en la versión Keil / ARM RealView, pero esencialmente realiza la misma función.
Tenga en cuenta que en CMSIS SystemInit()
se define en system_stm32f2xx.c, y puede necesitar personalización para su placa (frecuencia de cristal correcta, configuración de PLL, configuración de SRAM externa, etc.). Debido a que este es un código C, y está bien comentado, probablemente se sienta más cómodo con él.
Estoy trabajando con un chip ARM Cortex M3 (STM32F2) y ST proporciona una "biblioteca de periféricos estándar". Tiene algunos archivos .c y .h útiles. También tiene archivos .s.
¿Cuál es el propósito de estos archivos .s en el contexto de un proyecto de C? ¿Cómo consigo mi compilador / enlazador /? ¿Para tenerlos en cuenta?
Por lo general, contienen código de ensamblaje. El ensamblador los convierte en archivos de objetos que luego son vinculados por el enlazador con las cosas principales. Pero imagino que depende del compilador, la cadena de herramientas, etc.
Probablemente tengas un entorno de desarrollo basado en Keil para tu kit de ST. Dependiendo de la versión de su compilador, el archivo de proyecto debe tener diferentes secciones para C, C ++ y código de ensamblador. En su IDE, abra su proyecto y busque "Propiedades del proyecto" o algo parecido.
Puede importar y exportar símbolos hacia y desde el código del ensamblador para que se vinculen con el código C / C ++. Con Keil todo se integra razonablemente bien.
La directiva EXPORT le dice al ensamblador que haga público el símbolo especificado para que su código C / C ++ pueda vincularlo.
La directiva IMPORT le dice al ensamblador que el símbolo especificado se define en otro lugar y se resolverá en el momento del enlace.