Голый металл STM32

#c #gnu-make

Вопрос:

У меня есть проект с использованием STM32F103C8T6. В нем есть дерево:

 __main.c |__main.h |__led.c |__led.h |__stm32f1xx_startup.c |__Makefile  

Я использую arm-none-eabi-gcc для компиляции этого проекта. Makefile как показано ниже:

 CC = arm-none-eabi-gcc MARCH = cortex-m3 CFLAGS = -c -mcpu=$(MARCH) -mthumb -std=gnu11 -Wall -O0 RM = rm -rf OBJS = $(patsubst %.c,%.o,$(wildcard *.c)) INCS = $(wildcard *.h) all: $(OBJS)  $(CC) $(CFLAGS) $lt; -o $@ %.o: %.c %.h  $(CC) $(CFLAGS) $lt; -o $@  .PHONY: clean clean:  $(RM) *.o all  

Когда я запускаю make команду с помощью терминала VS Code,она не генерирует файл выполнения и имеет предупреждение, подобное этому:

 minh@Minh:~/Workspaces/Stm32/BeraMetal$ make arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.c -o main.o arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c -o stm32f1xx_startup.o stm32f1xx_startup.c arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 led.c -o led.o arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.o -o all arm-none-eabi-gcc: warning: main.o: linker input file unused because linking not done  

Пожалуйста, скажите мне, как я могу это исправить? Заранее благодарю.

Комментарии:

1. Прежде всего, ваше all правило в файле makefile назовет выходной файл all . Во-вторых, ваше all правило будет связывать (когда вы исправите ошибку компоновщика) только первый объектный файл в программе all .

Ответ №1:

Вы используете одни и те же флаги для обеих компиляций в объектные файлы, как и при попытке связать объектные файлы вместе.

Проблема в том, что команда связывания затем будет использовать -c флаги, которые используются для создания объектных файлов.

Вам нужно разделить флаги компиляции и компоновщика. Или, по крайней мере, не указывать -c в CFLAGS .

Ответ №2:

как я могу это исправить?

Не переходите -c к этапу связывания. Кроме того, вы должны передать все объекты компоновщику.

 CFLAGS = -mcpu=$(MARCH) -mthumb -std=gnu11 -Wall -O0 all: $(OBJS)  $(CC) $(CFLAGS) $^ -o $@ %.o: %.c %.h  $(CC) $(CFLAGS) -c $lt; -o $@  

Подумайте о том, чтобы использовать что — то новее, чем дедушкин макияж CMake Scons Meson .

Комментарии:

1. в нем есть ошибка: minh@Minh:~/Workspaces/Stm32/BeraMetal$ make arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c main.c -o main.o arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c -o stm32f1xx_startup.o stm32f1xx_startup.c arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 -c led.c -o led.o arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -std=gnu11 -Wall -O0 main.o -o all /home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld:

2. /home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(lib_a-exit.o): in function выход’: выход.c:(.text.exit 0x16): неопределенная ссылка на _exit' /home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: main.o: in function main’:`

3. main.c:(.text 0x2a): undefined reference to hal_gpio_ написание/home/minh/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux/gcc-arm-none-eabi-10.3-2021.07/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: main.c:(.text 0x36): неопределенная ссылка на HAL_GPIO_WritePin' collect2: error: ld returned 1 exit status make: *** [Makefile:15: all] Error 1

4. undefined reference to _exit исследуйте, что такое newlib и nosys.specs и что он делает. undefined reference to HAL_GPIO_WritePin ну, это не значит, что вы можете вызвать любую функцию из своего кода, и она будет работать, вы должны связать с ней. Чтобы установить связь с библиотеками STM32 HAL, вам необходимо загрузить и скомпилировать их, а также установить связь с ними. Исследуйте, что такое неопределенная ссылка и что она означает.