¿Puedo usar solo GCC para compilar el programa para Nucleo?

0

Tengo un ST Nucleo F446RE . Es una placa ARM que proporciona una interfaz bastante interesante para cargar programas: se presenta como un dispositivo de almacenamiento USB y el programa se puede copiar en ella, lo que hace que Nucleo se reinicie y lance el programa.

Como tal, estoy un poco renuente a siquiera molestarme en instalar (aún otra) cadena de herramientas de desarrollo. Prefiero usar el compilador GCC, algunos makefile para compilar y flashear y probablemente algunas bibliotecas de encabezado Nucleo necesarias.

¿Hay una manera de configurar un entorno ligero como este para Nucleo? Probablemente vale la pena mencionar que soy un novato en el desarrollo de desarrollo.

    
pregunta Tomáš Zato

4 respuestas

4

Al igual que con cualquier otro procesador, necesitará un compilador que apunte a la CPU que está utilizando.

En otras palabras, sí, debería / puede usar el GCC, pero: no puede usar el gcc que se dirige a su PC, pero necesita usar un GCC que apunte al procesador.

En este caso, el compilador se llamaría arm-none-eabi-gcc (para ARM ISA, sin sistema operativo, con la interfaz binaria de la aplicación extendida), y deberá informar al vinculador (que también debe apuntar a la misma plataforma) la cantidad de memoria que tiene en qué espacios de direcciones (ese es el trabajo de un script de vinculador). Entonces probablemente también querrías un arm-none-eabi-gdb ; en esencia, necesita una cadena de herramientas completa arm-none-eabi .

Pero esta cadena de herramientas es bastante fácil de conseguir; en mis sistemas (Fedora Linux), eso sería tan complicado como usar dnf search arm-none-eabi para encontrar los paquetes que quiero y luego dnf install ing esos.

A menudo, puede usar su entorno de editor / IDE existente bastante bien para el desarrollo integrado simplemente diciéndole que tiene que prefijar cada nombre ejecutable ( gcc , as , ld , ...) con arm-none-eabi ; hecho.

    
respondido por el Marcus Müller
2

Como indican otras respuestas, desea utilizar arm-none-eabi-gcc para compilar su código.

Sin embargo, el código compilado (por sí mismo) no hace mucho bien! Necesitas convertirlo a un formato .elf o .hex. Necesitas poder cargarlo en el microcontrolador. Probablemente desee poder depurar el código en el destino.

Recomiendo usar la GNU ARM Embedded Toolchain gratuita. Es sólo la cadena de herramientas; no proporciona un IDE. Es una instalación única, e incluye:

  • arm-none-eabi-gcc (para compilar código)
  • arm-none-eabi-gdb (para depurar)
  • arm-none-eabi-objcopy (para traducir a .hex)
  • tamaño de arm-none-eabi (para obtener una lectura de la utilización de la memoria de su código)
  • (más)

Lo mantienen los desarrolladores de ARM y está disponible para Windows / MacOS / Linux.

Hay un proyecto separado para el desarrollo de ARM utilizando Eclipse IDE, llamado GNU ARM Eclipse . Incluso si no desea utilizar Eclipse, le recomendamos que escanee su sitio web. Explican cómo instalar GNU ARM Embedded Toolchain, cómo configurar diferentes depuradores, etc.

Por cierto, GNU ARM Eclipse es particularmente bueno para el desarrollo de ST ARM. Ha incorporado scripts de vinculador para las diferentes familias ST, tiene vínculos con las bibliotecas periféricas estándar de ST, etc.

Finalmente, me doy cuenta de que esto pasa por alto la interfaz de programación USB personalizada presentada por Nucleo. Mi opinión personal es que deberías usar estas herramientas estándar en su lugar, principalmente porque terminarás usándolas cuando quieras transferir tu código a una placa que no sea Nucleo.

Respondiendo a su comentario, nunca he visto a.out ("salida del ensamblador") utilizado para los microcontroladores ARM. En mis proyectos, generalmente tengo muchos archivos c, cada uno de los cuales se compila en un archivo objeto. Luego, los objetos se combinan con el enlazador, que genera un archivo hexadecimal o elfo.

Aquí hay información adicional en caso de que ayude:

Mis comandos de compilación son complicados, pero son manejados por mi IDE, por lo que es transparente para mí. Aquí hay un ejemplo para main.c :

  

arm-none-eabi-gcc -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -ffreestanding -Wunused -Wuninitialized -Wallra -Wmissing -Declaraciones--Punto de uso -Gratis--Gratis -Galera -DeL -Acceso -Gratis -Acceso -Gratis -Acceso -Gratis -Acceso -Gr. "../include/usb" -I "../ system / include" -I "../ system / include / cmsis" -I "../ system / include / stm32f1-stdperiph" -I "../ system / STM32_USB_Device_Library / Core / inc "-I" ../ system / STM32_USB_Device_Library / Class / cdc / inc "-I" ../ system / STM32_USB_OTG_Driver / inc "-std = gnu11 -Wmissing-prot. -function-cast -MMD -MP -MF "src / main.d" -MT "src / main.o" -c -o "src / main.o" "../src/main.c"

Esto incluye el enganche a las bibliotecas periféricas estándar ("SPL"), opciones para permitir la depuración, etc. ¡Si eliminó todas las inclusiones, advertencias y cosas de SPL (¡pero en realidad no debería eliminar las advertencias!) , todavía te quedan:

  

arm-none-eabi-gcc -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -freestanding -g3 -std = gnu11 -MMD -MP -MF "src / main.d" -MT "src / main.o" -c -o "src / main.o" "../src/main.c"

Algunos de estos pueden seguir siendo innecesarios, pero te dan una idea de lo que se necesita.

Luego, después de que se crean todos los archivos de objetos, se vinculan así: (He simplificado el siguiente comando)

  

Invocando: Cross ARM C ++ Linker

     

arm-none-eabi-g ++ -mcpu = cortex-m3 -mthumb -Og -fmessage-length = 0 -fsigned-char -función-secciones -fdata-secciones -freestanding -g3 -T mem.ld -T libs .ld -Tections.ld -nostartfiles -Xlinker --gc -ections -L "../ ldscripts" -Wl, -Map, "MotioSens_AP.map" --specs = nano.specs -o "MotioSens_AP.elf". /src/main.o ./{my otros archivos de objetos} .o

     

Objetivo de construcción terminado: MotioSens_AP.elf

Algunas de las opciones de comando están duplicadas, por lo que podría ser innecesario pasar tanto al compilador como al enlazador. Nuevamente, ya que mi IDE lo maneja, realmente no he prestado atención :)

Estas complejidades en el desarrollo de ARM son una de las razones por las que comencé a usar un IDE (Eclipse, en mi caso).

    
respondido por el bitsmack
1

¡Sí, puedes!

Puedes obtener tu script de enlace desde stm32cubef4 . Entonces solo crea un Makefile simple y estás listo para rockear. Asegúrese de que enlaza las cosas básicas (CMSIS). El cubef4 contiene muchos ejemplos que puede ver si no está seguro.

Por supuesto que necesitarás la cadena de herramientas gnu. Simplemente busque arm-none-eabi-gcc y lo encontrará.

    
respondido por el staringlizard
0
  

¿Hay una manera de configurar un entorno ligero como este para Nucleo?

Hablando técnicamente, el compilador (a la derecha) es todo lo que necesitas. ARM mantiene una variante de GCC para su chip y puede descargarlo y eso es todo lo que hay.

Pero, en realidad, es posible que desee investigar dos cosas:

  1. Un IDE: hace la vida más fácil para la mayoría incorporando edición, compilación y depuración todo en uno. Hay toneladas de ellos, tanto gratuitos, casi gratuitos como comerciales. Más bajo Windows que no.

  2. Bibliotecas: facilita el desarrollo rápido de su código. Hay terceros para gráficos, LCD, ... y hay proveedores, por ejemplo, de ST. Puede desarrollar código para su chip sin el uso de dichas bibliotecas, para que quede claro.

Los que encuentres útiles son completamente subjetivos. Personalmente, código fuera de un conjunto de IDE y a veces uso bibliotecas OEM. Pero puede ser subjetivo.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas