Ошибка makefile - инфраструктура тестирования Unity - Keil uvision 5 - STM32CubeMx

Я пытался интегрировать Unity Testing Framework в Keil версии 5, естественно, я столкнулся с множеством проблем и ошибок и смог решить многие из них, теперь я столкнулся с ошибкой, с которой я хотел бы получить вашу поддержку.

Краткое описание:

Это мой дипломный проект, посвященный тестированию встроенного программного обеспечения, и команды разработчиков используют Keil uvision 5 со скелетом кода и конфигурацией, сгенерированной с помощью STM32CubeMx, для разработки проекта самостоятельного вождения автомобиля в моем университете.

Окружающая среда

OS: Windows 10
IDE-Version:
µVision V5.24.2.0
Tool Version Numbers:
Toolchain:        MDK-ARM Professional  Version: 5.24.1
Toolchain Path:    C:\Keil_v5\ARM\ARMCC\Bin
C Compiler:         Armcc.exe        V5.06 update 5 (build 528)
Assembler:          Armasm.exe        V5.06 update 5 (build 528)
Linker/Locator:     ArmLink.exe        V5.06 update 5 (build 528)
Library Manager:    ArmAr.exe        V5.06 update 5 (build 528)
Hex Converter:      FromElf.exe        V5.06 update 5 (build 528)
CPU DLL:               SARMCM3.DLL          V5.24.1
Dialog DLL:         DCM.DLL              V1.16.0.0
Target DLL:             STLink\ST-LINKIII-KEIL_SWO.dll      V3.0.1.0
Dialog DLL:         TCM.DLL              V1.32.0.0
Practice board: STM32F446ZETx

Подход

Я планирую интегрировать Unity FW, используя make-файл для компиляции и запуска тестов в опции предварительной сборки, доступной в Keil. сейчас я пытаюсь заставить make-файл работать, используя командную строку вне Keil, и, как только он заработает, я думаю, что будет легко просто запустить его с помощью команды make из опции предварительной сборки Keil. Я следовал этому руководству, чтобы создать make-файл http://www.throwtheswitch.org/build/make

Я отредактировал make-файл, добавив соответствующий armcc и armlinker с параметрами командной строки, которые присутствовали в конфигурации keil проекта, и альтернативы компилятора arm для того, что учебник добавлял в их gcc, как вы увидите в make-файле ниже.

Структура

Ниже приведен пример структуры проекта Blinky с использованием таймера TIM10, созданного с использованием STM32CubeMx, и Unity FW добавляется в папку вручную.

--root
----Drivers
--------CMSIS --> "Drivers related files"
--------STM32F4xx_HAL-Driver --> "Drivers related files"
----Inc
---------gpio.h
---------main.h
---------stm32f4xx_hal_config.h
---------stm32f4xx_it.h
---------tim.h
----MDK-ARM
---------"Other STM32 related folders and files"
----Src
---------gpio.c
---------main.c
---------stm32f4xx_hal_msp.c
---------stm32f4xx_hal_config.c
---------stm32f4xx_it.c
---------tim.c
----Unity
---------build
-------------depends --> "autogenerated by makefile"
-------------objs --> "autogenerated by makefile"
-------------results --> "autogenerated by makefile"
-------------testing --> "autogenerated by makefile"
-------------TIM10_LED_1_Ceedling_try1.map
---------src
-------------stm32f4xx_hal.h
-------------unity_internals.h
-------------unity.c
-------------unity.h
---------test
-------------Testgpio.c
--.mxproject
--makefile
--mx.scratch
--TIM10_LED_1_Ceedling_try1.ioc

Makefile

ifeq ($(OS),Windows_NT)
  ifeq ($(shell uname -s),) # not in a bash-like shell
    CLEANUP = del /F /Q
    MKDIR = mkdir
  else # in a bash-like shell, like msys
    CLEANUP = rm -f
    MKDIR = mkdir -p
  endif
    TARGET_EXTENSION=exe
else
    CLEANUP = rm -f
    MKDIR = mkdir -p
    TARGET_EXTENSION=out
endif

.PHONY: clean
.PHONY: test

PATHU = Unity/src/
PATHS = Src/
PATHI = Unity/src/
PATHI2 = Inc
PATHI3 = Drivers/STM32F4xx_HAL_Driver/Inc
PATHI4 = Drivers/STM32F4xx_HAL_Driver/Inc/Legacy
PATHI5 = Drivers/CMSIS/Device/ST/STM32F4xx/Include
PATHI6 = Drivers/CMSIS/Include
PATHT = Unity/test/
PATHB = Unity/build/testing/
PATHD = Unity/build/depends/
PATHO = Unity/build/objs/
PATHR = Unity/build/results/

BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) $(PATHR)

SRCT = $(wildcard $(PATHT)*.c)

COMPILE=armcc -c --cpu Cortex-M4.fp -D__MICROLIB -g -O3 --apcs=interwork --split_sections
LINK=armlink --library_type=microlib --libpath="C:\Keil_v5\ARM\ARMCC\lib" --strict --scatter "MDK-ARM\TIM10_LED_1_Ceedling_try1\TIM10_LED_1_Ceedling_try1.sct" --diag_suppress=L6329 --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list "TIM10_LED_1_Ceedling_try1.map" -o "MDK-ARM\TIM10_LED_1_Ceedling_try1\TIM10_LED_1_Ceedling_try1.axf"
DEPEND=armcc --no_depend_system_headers --depend_dir=$(PATHD)
CFLAGS=-I. -I$(PATHU) -I$(PATHS) -I$(PATHI) -I$(PATHI2) -I$(PATHI3) -I$(PATHI4) -I$(PATHI5) -I$(PATHI6)

RESULTS = $(patsubst $(PATHT)Test%.c,$(PATHR)Test%.txt,$(SRCT) )

PASSED = `grep -s PASS $(PATHR)*.txt`
FAIL = `grep -s FAIL $(PATHR)*.txt`
IGNORE = `grep -s IGNORE $(PATHR)*.txt`

test: $(BUILD_PATHS) $(RESULTS)
    @echo "-----------------------\nIGNORES:\n-----------------------"
    @echo "$(IGNORE)"
    @echo "-----------------------\nFAILURES:\n-----------------------"
    @echo "$(FAIL)"
    @echo "-----------------------\nPASSED:\n-----------------------"
    @echo "$(PASSED)"
    @echo "\nDONE"

$(PATHR)%.txt: $(PATHB)%.$(TARGET_EXTENSION)
    -./$< > $@ 2>&1

$(PATHB)Test%.$(TARGET_EXTENSION): $(PATHO)Test%.o $(PATHO)%.o $(PATHU)unity.o $(PATHD)Test%.d
    $(LINK) $@ $^

$(PATHO)%.o:: $(PATHT)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHS)%.c
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHO)%.o:: $(PATHU)%.c $(PATHU)%.h
    $(COMPILE) $(CFLAGS) $< -o $@

$(PATHD)%.d:: $(PATHT)%.c
    $(DEPEND) $@ $<

$(PATHB):
    $(MKDIR) $(PATHB)

$(PATHD):
    $(MKDIR) $(PATHD)

$(PATHO):
    $(MKDIR) $(PATHO)

$(PATHR):
    $(MKDIR) $(PATHR)

clean:
    $(CLEANUP) $(PATHO)*.o
    $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION)
    $(CLEANUP) $(PATHR)*.txt

.PRECIOUS: $(PATHB)Test%.$(TARGET_EXTENSION)
.PRECIOUS: $(PATHD)%.d
.PRECIOUS: $(PATHO)%.o
.PRECIOUS: $(PATHR)%.txt

Текущий вывод и ошибка

$ makecc -I. -IUnity/src/ -ISrc/ -IUnity/src/ -IInc -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IDrivers/CMSIS/Include   -c -o Unity/src/unity.o Unity/src/unity.c
armcc --no_depend_system_headers --depend_dir=Unity/build/depends/ Unity/build/depends/Testgpio.d Unity/test/Testgpio.c
Error: C4065E: type of input file 'Unity/build/depends/Testgpio.d' unknown

make: *** [makefile:74: Unity/build/depends/Testgpio.d] Error 1
rm Unity/src/unity.o

UPDATE - простой make-файл для проверки ошибки зависимости

SRC = $(wildcard *.c)
TAR = $(SRC:.c=.d)
DEPEND=armcc --no_depend_system_headers

all: $(TAR)

%.d: %.c
    $(DEPEND) $@ $<

К сожалению это вернулось armcc --no_depend_system_headers test.d test.c Error: C4065E: type of input file 'test.d' unknow

но когда поменял компилятор и флаги в

SRC = $(wildcard *.c)
TAR = $(SRC:.c=.d)
DEPEND=gcc -MM -MG -MF

all: $(TAR)

%.d: %.c
    $(DEPEND) $@ $<

это сработало и test.d создан из test.c - все файлы находятся в одной папке

Обновить

Мне удалось заставить armcc работать, после проверки документов я обновил свой make-файл следующим образом:

SRC = $(wildcard *.c)
TAR = $(SRC:.c=.d)
DEPEND=armcc --no_depend_system_headers --ignore_missing_headers --md --depend

all: $(TAR)

%.d: %.c
    $(DEPEND) $@ $<

с makefile и исходным файлом в одной папке он работает нормально.

Теперь, когда вернулись в основной make-файл и обновили флаги DEPEND следующим образом

armcc --no_depend_system_headers --ignore_missing_headers --md --depend

Он возвратил другую ошибку, связанную с armlink, я не знаю, как идет процесс, что запускается первым, а что зависит от другого, но факт остается фактом, когда я запускаю make сейчас, она выдает следующую ошибку:

$ make
cc -I. -IUnity/src/ -ISrc/ -IUnity/src/ -IInc -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IDrivers/CMSIS/Include   -c -o Unity/src/unity.o Unity/src/unity.c
armlink --library_type=microlib --libpath="C:\Keil_v5\ARM\ARMCC\lib" --strict --scatter "MDK-ARM\TIM10_LED_1_Ceedling_try1\TIM10_LED_1_Ceedling_try1.sct" --diag_suppress=L6329 --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list "TIM10_LED_1_Ceedling_try1.map" -o "MDK-ARM\TIM10_LED_1_Ceedling_try1\TIM10_LED_1_Ceedling_try1.axf" Unity/build/testing/Testgpio.exe Unity/build/objs/Testgpio.o Unity/build/objs/gpio.o Unity/src/unity.o
Fatal error: L6002U: Could not open file Unity/build/testing/Testgpio.exe: No such file or directory
Finished: 0 information, 0 warning, 0 error and 1 fatal error messages.
make: *** [makefile:62: Unity/build/testing/Testgpio.exe] Error 1
rm Unity/src/unity.o

Я буду продолжать работать над этим, но если кто-то может помочь, пожалуйста, сделайте

Отличное обновление!

Предыдущая ошибка исчезла, и я начинаю видеть фактический прогресс! Я закомментировал тест $(PATHD)%.d на шаге LINK, поскольку он был закомментирован в оригинальном файле, который я получил, когда я его включил, ошибка исчезла, и теперь я сталкиваюсь с синтаксическими ошибками и предупреждениями из реальных файлов:) пожалуйста, проверьте ниже и посоветуйте

$ make
armcc --no_depend_system_headers --ignore_missing_headers --depend Unity/build/depends/Testgpio.d Unity/test/Testgpio.c
"Unity/test/Testgpio.c", line 13: Warning:  #223-D: function "TEST_ASSERT_EQUAL" declared implicitly
      TEST_ASSERT_EQUAL(2, AddFunction_ReturnCorrect(1, 1));
      ^
"Unity/test/Testgpio.c", line 13: Warning:  #223-D: function "AddFunction_ReturnCorrect" declared implicitly
      TEST_ASSERT_EQUAL(2, AddFunction_ReturnCorrect(1, 1));
                           ^
"Unity/test/Testgpio.c", line 19: Warning:  #223-D: function "UnityBegin" declared implicitly
        UnityBegin("test/Testgpio.c");
        ^
"Unity/test/Testgpio.c", line 20: Warning:  #223-D: function "RUN_TEST" declared implicitly
        RUN_TEST(test_AddFunction_ReturnCorrect_ShouldReturnCorrectSum);
        ^
"Unity/test/Testgpio.c", line 22: Warning:  #223-D: function "UnityEnd" declared implicitly
        return (UnityEnd());
                ^
Unity/test/Testgpio.c: 5 warnings, 0 errors
Error: L6218E: Undefined symbol AddFunction_ReturnCorrect (referred from Testgpio.o).
Error: L6218E: Undefined symbol RUN_TEST (referred from Testgpio.o).
Error: L6218E: Undefined symbol TEST_ASSERT_EQUAL (referred from Testgpio.o).
Error: L6218E: Undefined symbol UnityBegin (referred from Testgpio.o).
Error: L6218E: Undefined symbol UnityEnd (referred from Testgpio.o).
Finished: 0 information, 0 warning and 5 error messages.
make: *** [makefile:74: Unity/build/depends/Testgpio.d] Error 1

Обновить

Я не то, что здесь происходит, после 3 4 делает предыдущую ошибку возвращается

Обновить

ОК, так что, если я удаляю папку сборки и запускаю make, она выдает ошибки L6218E, а если я снова запускаю make, выдает ошибку L6002U. Также кто-то может объяснить, почему в конце каждого запуска rm Unity/src/unity.o?

0 ответов

Другие вопросы по тегам