Consuming FreeRTOS CMake results in errors for STM32f7xx

Hi,

I am trying to setup a project with the latest FreeRTOS kernel in combination with stm32f746zg microcontroller (Cortex M7 with fpu). I started without the FreeRTOS kernel and that works on the NUCLEO-F746ZG devboard. Now I tried to compile it with the FreeRTOS kernel, but now I am stuck at this point.

folder structure:

  • build
  • external
    • drivers
    • freertos
  • src
    • main.c
    • FreeRTOSConfig.h
    • stm32f7xx_hal_conf.h (configuration file for STM32 HAL)
  • arm-none-eabi-gcc.cmake
  • CMakeLists.txt
  • stm32f7.ld

CMakeLists.txt :

cmake_minimum_required(VERSION 3.15.3)

project(stm32)

enable_language(C ASM)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

# FreeRTOS configurations
set(FREERTOS_CONFIG_FILE_DIRECTORY "${CMAKE_SOURCE_DIR}/src" CACHE STRING "")
set(FREERTOS_PORT GCC_ARM_CM7 CACHE STRING "")

add_subdirectory(external)

set(SRC_FILES
    external/drivers/cmsis/cmsis_device_f7/Source/Templates/system_stm32f7xx.c

    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal_gpio.c
    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal.c
    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal_cortex.c
    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal_uart.c
    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal_uart_ex.c
    external/drivers/hal/stm32f7xx_hal_driver/Src/stm32f7xx_hal_rcc.c

    src/main.c

    external/drivers/cmsis/cmsis_device_f7/Source/Templates/gcc/startup_stm32f746xx.s
)

set(EXECUTABLE ${PROJECT_NAME}.elf)

add_executable(${EXECUTABLE} ${SRC_FILES})

target_compile_definitions(${EXECUTABLE} PRIVATE
        -DUSE_HAL_DRIVER
        -DSTM32F746xx
)

target_include_directories(${EXECUTABLE} PRIVATE
    external/drivers/cmsis/cmsis_device_f7/Include
    external/drivers/cmsis/cmsis_5/CMSIS/Core/Include
    external/drivers/hal/stm32f7xx_hal_driver/Inc
    external/drivers/hal/stm32f7xx_hal_driver/Inc/Legacy
    src
)

target_compile_options(${EXECUTABLE} PRIVATE
        -mcpu=cortex-m7
        -mthumb
        -mfpu=fpv5-sp-d16
        -mfloat-abi=hard

        -fdata-sections
        -ffunction-sections
        -fno-strict-aliasing

        -Wall

        $<$<CONFIG:Debug>:-Og>
)

target_link_options(${EXECUTABLE} PRIVATE
        -T${CMAKE_SOURCE_DIR}/stm32f7.ld
        -mcpu=cortex-m7
        -mthumb
        -mfpu=fpv5-sp-d16
        -mfloat-abi=hard
        -specs=nano.specs
        -lc
        -lm
        -lnosys
        -Wl,-Map=${PROJECT_NAME}.map,--cref
        -Wl,--gc-sections
        -Wl,--print-memory-usage
)

target_link_libraries(${EXECUTABLE} PRIVATE
        freertos_kernel)

# Print executable size
add_custom_command(TARGET ${EXECUTABLE}
        POST_BUILD
        COMMAND arm-none-eabi-size ${EXECUTABLE}
)

# Create bin file & hex file
add_custom_command(TARGET ${EXECUTABLE}
        POST_BUILD
        COMMAND arm-none-eabi-objcopy -O ihex ${EXECUTABLE} ${PROJECT_NAME}.hex
        COMMAND arm-none-eabi-objcopy -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin
)

Output:

dev@virtual-machine:~/workspace/base/build-debug$ cmake -DCMAKE_TOOLCHAIN_FILE=../arm-none-eabi-gcc.cmake -DCMAKE_BUILD_TYPE=Debug ..
-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 10.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/arm-none-eabi-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/arm-none-eabi-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/arm-none-eabi-gcc
-- Configuring done
-- Generating done
-- Build files have been written to: /home/dev/workspace/base/build-debug
dev@virtual-machine:~/workspace/base/build-debug$ make
[  4%] Building C object external/freertos/portable/CMakeFiles/freertos_kernel_port.dir/GCC/ARM_CM7/r0p1/port.c.obj
/tmp/cctHnfI4.s: Assembler messages:
/tmp/cctHnfI4.s:162: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:163: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:164: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:165: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:166: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:186: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:187: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:188: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:189: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:190: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:246: Error: selected processor does not support requested special purpose register -- `msr psp,r0'
/tmp/cctHnfI4.s:247: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:249: Error: selected processor does not support requested special purpose register -- `msr basepri,r0'
/tmp/cctHnfI4.s:282: Error: selected processor does not support requested special purpose register -- `msr msp,r0'
/tmp/cctHnfI4.s:284: Error: selected processor does not support requested special purpose register -- `msr control,r0'
/tmp/cctHnfI4.s:285: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:286: Error: selected processor does not support `cpsie f' in ARM mode
/tmp/cctHnfI4.s:287: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:288: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:327: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:328: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:329: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:330: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:331: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:378: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:379: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:380: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:381: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:382: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:438: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:439: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:440: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:441: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:442: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:476: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:477: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:478: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:479: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:480: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:542: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:543: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:544: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:545: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:546: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:580: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:622: Error: selected processor does not support requested special purpose register -- `mrs r0,psp'
/tmp/cctHnfI4.s:623: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:630: Error: selected processor does not support `vstmdbeq r0!,{s16-s31}' in ARM mode
/tmp/cctHnfI4.s:637: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:638: Error: selected processor does not support requested special purpose register -- `msr basepri,r0'
/tmp/cctHnfI4.s:639: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:640: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:641: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:644: Error: selected processor does not support requested special purpose register -- `msr basepri,r0'
/tmp/cctHnfI4.s:654: Error: selected processor does not support `vldmiaeq r0!,{s16-s31}' in ARM mode
/tmp/cctHnfI4.s:656: Error: selected processor does not support requested special purpose register -- `msr psp,r0'
/tmp/cctHnfI4.s:657: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:699: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:700: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:701: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:702: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:703: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:733: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:832: Error: unexpected character `w' in type specifier
/tmp/cctHnfI4.s:832: Error: bad instruction `ldr.w r0,=0xE000ED88'
/tmp/cctHnfI4.s:871: Error: selected processor does not support requested special purpose register -- `mrs r3,ipsr'
/tmp/cctHnfI4.s:899: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:900: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:901: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:902: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:903: Error: selected processor does not support `cpsie i' in ARM mode
/tmp/cctHnfI4.s:931: Error: selected processor does not support `cpsid i' in ARM mode
/tmp/cctHnfI4.s:932: Error: selected processor does not support requested special purpose register -- `msr basepri,r3'
/tmp/cctHnfI4.s:933: Error: selected processor does not support `isb ' in ARM mode
/tmp/cctHnfI4.s:934: Error: selected processor does not support `dsb ' in ARM mode
/tmp/cctHnfI4.s:935: Error: selected processor does not support `cpsie i' in ARM mode
make[2]: *** [external/freertos/portable/CMakeFiles/freertos_kernel_port.dir/build.make:76: external/freertos/portable/CMakeFiles/freertos_kernel_port.dir/GCC/ARM_CM7/r0p1/port.c.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:184: external/freertos/portable/CMakeFiles/freertos_kernel_port.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

Not sure what is going wrong. Can somebody help me with this issue? I cannot find a proper CMake example similar to my example.

It seems that the compile options are not propagated to FreeRTOS files. Would you try using add_compile_options before add_subdirectory instead of target_compile_options? If that does not work, please share your code so that we can give it a try.

Hi aggarg,

Thanks! That worked indeed.