Hi there,
I want to use CppUTest on the nRF52 to start developing my personal and not so personal projects. I am using the SDK for nRF52, with PCA10040's board. For the moment, I am trying to compile blinky's blank example using armgcc.
I modified the example's main.c -> main.cpp to include CppUTest libraries:
extern "C" { #include <stdbool.h> #include <stdint.h> #include "nrf_delay.h" #include "boards.h" } #include "CommandLineTestRunner.h" IMPORT_TEST_GROUP(Dummy); /** * @brief Function for application main entry. */ int main(void) { char test[] = "Dummy"; int argc = 2; char* argv = (char*) test; RUN_ALL_TESTS(argc, &argv); /* Configure board. */ bsp_board_init(BSP_INIT_LEDS); /* Toggle LEDs. */ while (true) { for (int i = 0; i < LEDS_NUMBER; i++) { bsp_board_led_invert(i); nrf_delay_ms(500); } } }
An I also modified the pca10040/blank/armgcc/Makefile to include CppUTest header files and static .a libraries:
PROJECT_NAME := blinky_pca10040 TARGETS := nrf52832_xxaa OUTPUT_DIRECTORY := _build SDK_ROOT := ../../../../../.. PROJ_DIR := ../../.. SDK_CppUTest := $(SDK_ROOT)/../../cpputestbuild/ $(OUTPUT_DIRECTORY)/nrf52832_xxaa.out: \ LINKER_SCRIPT := blinky_gcc_nrf52.ld # Source files common to all targets SRC_FILES += \ $(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52.S \ $(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \ $(SDK_ROOT)/components/libraries/log/src/nrf_log_str_formatter.c \ $(SDK_ROOT)/components/boards/boards.c \ $(SDK_ROOT)/components/libraries/util/app_error.c \ $(SDK_ROOT)/components/libraries/util/app_error_handler_gcc.c \ $(SDK_ROOT)/components/libraries/util/app_error_weak.c \ $(SDK_ROOT)/components/libraries/util/app_util_platform.c \ $(SDK_ROOT)/components/libraries/util/nrf_assert.c \ $(SDK_ROOT)/components/libraries/atomic/nrf_atomic.c \ $(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \ $(SDK_ROOT)/external/fprintf/nrf_fprintf.c \ $(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \ $(SDK_ROOT)/components/libraries/memobj/nrf_memobj.c \ $(SDK_ROOT)/components/libraries/ringbuf/nrf_ringbuf.c \ $(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \ $(SDK_ROOT)/modules/nrfx/soc/nrfx_atomic.c \ $(PROJ_DIR)/main.cpp \ $(SDK_ROOT)/modules/nrfx/mdk/system_nrf52.c \ # Include folders common to all targets INC_FOLDERS += \ $(SDK_ROOT)/components \ $(SDK_ROOT)/modules/nrfx/mdk \ $(PROJ_DIR) \ $(SDK_ROOT)/components/libraries/strerror \ $(SDK_ROOT)/components/toolchain/cmsis/include \ $(SDK_ROOT)/components/libraries/util \ ../config \ $(SDK_ROOT)/components/libraries/balloc \ $(SDK_ROOT)/components/libraries/ringbuf \ $(SDK_ROOT)/modules/nrfx/hal \ $(SDK_ROOT)/components/libraries/bsp \ $(SDK_ROOT)/components/libraries/log \ $(SDK_ROOT)/modules/nrfx \ $(SDK_ROOT)/components/libraries/experimental_section_vars \ $(SDK_ROOT)/components/libraries/delay \ $(SDK_ROOT)/integration/nrfx \ $(SDK_ROOT)/components/drivers_nrf/nrf_soc_nosd \ $(SDK_ROOT)/components/libraries/atomic \ $(SDK_ROOT)/components/boards \ $(SDK_ROOT)/components/libraries/memobj \ $(SDK_ROOT)/external/fprintf \ $(SDK_ROOT)/components/libraries/log/src \ $(SDK_CppUTest)/ \ # Libraries common to all targets LIB_FILES += \ $(SDK_CppUTest)/libCppUTest.a \ $(SDK_CppUTest)/libCppUTestExt.a \ # Optimization flags OPT = -O3 -g3 # Uncomment the line below to enable link time optimization #OPT += -flto # C flags common to all targets CFLAGS += $(OPT) CFLAGS += -DBOARD_PCA10040 CFLAGS += -DBSP_DEFINES_ONLY CFLAGS += -DCONFIG_GPIO_AS_PINRESET CFLAGS += -DFLOAT_ABI_HARD CFLAGS += -DNRF52 CFLAGS += -DNRF52832_XXAA CFLAGS += -DNRF52_PAN_74 CFLAGS += -mcpu=cortex-m4 CFLAGS += -mthumb -mabi=aapcs CFLAGS += -Wall -Werror CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # keep every function in a separate section, this allows linker to discard unused ones CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing CFLAGS += -fno-builtin -fshort-enums # C++ flags common to all targets CXXFLAGS += $(OPT) # Assembler flags common to all targets ASMFLAGS += -g3 ASMFLAGS += -mcpu=cortex-m4 ASMFLAGS += -mthumb -mabi=aapcs ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 ASMFLAGS += -DBOARD_PCA10040 ASMFLAGS += -DBSP_DEFINES_ONLY ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET ASMFLAGS += -DFLOAT_ABI_HARD ASMFLAGS += -DNRF52 ASMFLAGS += -DNRF52832_XXAA ASMFLAGS += -DNRF52_PAN_74 # Linker flags LDFLAGS += $(OPT) LDFLAGS += -mthumb -mabi=aapcs -L$(SDK_ROOT)/modules/nrfx/mdk -T$(LINKER_SCRIPT) LDFLAGS += -mcpu=cortex-m4 LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # let linker dump unused sections LDFLAGS += -Wl,--gc-sections # use newlib in nano version LDFLAGS += --specs=nano.specs nrf52832_xxaa: CFLAGS += -D__HEAP_SIZE=8192 nrf52832_xxaa: CFLAGS += -D__STACK_SIZE=8192 nrf52832_xxaa: ASMFLAGS += -D__HEAP_SIZE=8192 nrf52832_xxaa: ASMFLAGS += -D__STACK_SIZE=8192 # Add standard libraries at the very end of the linker input, after all objects # that may need symbols provided by these libraries. LIB_FILES += -lc -lnosys -lm .PHONY: default help # Default target - first one defined default: nrf52832_xxaa # Print all targets that can be built help: @echo following targets are available: @echo nrf52832_xxaa @echo sdk_config - starting external tool for editing sdk_config.h @echo flash - flashing binary TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc include $(TEMPLATE_PATH)/Makefile.common $(foreach target, $(TARGETS), $(call define_target, $(target))) .PHONY: flash erase # Flash the program flash: default @echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase nrfjprog -f nrf52 --reset erase: nrfjprog -f nrf52 --eraseall SDK_CONFIG_FILE := ../config/sdk_config.h CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar sdk_config: java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE)
Technically the makefile knows what is needed, however I am having troubles with the linker script, which complains:
Compiling file: main.cpp Linking target: _build/nrf52832_xxaa.out ../../../../../../../../cpputestbuild//libCppUTest.a: error adding symbols: File format not recognized collect2: error: ld returned 1 exit status ../../../../../../components/toolchain/gcc/Makefile.common:292: recipe for target '_build/nrf52832_xxaa.out' failed make: *** [_build/nrf52832_xxaa.out] Error 1
I am really newbie with linker scripts so I am not sure what this message actually means. Googling around I found someone commenting on the linker not being able to read the library? Perhaps you guys could please help me? I am not sure how to proceed, and perhaps someone has solved this issue before.
Thank you,
Pablo G