2

最近、stm32 プロジェクトを CMake に切り替えて、IDE に依存しないようにしました。ルート リポジトリ (アプリケーション) には複数のサブモジュール (HAL、FreeRTOS など) が含まれ、その CMakeLists.txt には使用されるすべてのファイルが明示的に含まれています。

set(EXECUTABLE ${PROJECT_NAME}.elf)

add_executable(${EXECUTABLE}
    
    # Own sources
    src/main.c
    src/SEGGER_SYSVIEW_Config_FreeRTOS.c
    src/startup_stm32h723zgtx.s
    src/stm32h7xx_hal_timebase_tim.c
    src/system_stm32h7xx.c

    # Base CMSIS and HAL library
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c
            
    #long list of HAL c files there...

    # FreeRTOS library
    lib-freertos/croutine.c
    lib-freertos/event_groups.c
    lib-freertos/list.c
    lib-freertos/queue.c
    lib-freertos/stream_buffer.c
    lib-freertos/tasks.c
    lib-freertos/timers.c
    lib-freertos/portable/GCC/ARM_CM7/r0p1/port.c
    lib-freertos/trace/Sample/FreeRTOSV10/SEGGER_SYSVIEW_FreeRTOS.c
    lib-freertos/trace/SEGGER/Syscalls/SEGGER_RTT_Syscalls_GCC.c
    lib-freertos/trace/SEGGER/SEGGER_RTT_ASM_ARMv7M.S
    lib-freertos/trace/SEGGER/SEGGER_RTT_printf.c
    lib-freertos/trace/SEGGER/SEGGER_RTT.c
    lib-freertos/trace/SEGGER/SEGGER_SYSVIEW.c
    )
    
target_include_directories(${EXECUTABLE}
    PRIVATE
    include
    src
    
    lib-hal/stm32h7xx/CMSIS/Include
    lib-hal/stm32h7xx/CMSIS/Device/ST/STM32H7xx/Include
    lib-hal/stm32h7xx/STM32H7xx_HAL_Driver/Inc
    
    lib-freertos/include
    lib-freertos/trace/Config
    lib-freertos/trace/SEGGER
    lib-freertos/trace/Sample/FreeRTOSV10/
    lib-freertos/portable/GCC/ARM_CM7/r0p1
    )

このソリューションは機能しますが、持続可能なアプローチではないことはわかっています。そこで、ソースとインクルードを指定して、lib-hal および lib-freertos サブモジュールでライブラリを作成しようとしました

add_library(lib-hal-stm32h7xx)

target_include_directories(lib-hal-stm32h7xx
    PUBLIC
    CMSIS/Include
    CMSIS/Device/ST/STM32H7xx/Include
    STM32H7xx_HAL_Driver/Inc
    PRIVATE
    STM32H7xx_HAL_Driver/Src
)

target_sources(lib-hal-stm32h7xx
    PRIVATE
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c
    STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c

    #long list of HAL c files there...
)

そして使用する

add_subdirectory(lib-hal/stm32h7xx)
add_subdirectory(lib-freertos)

target_link_library(${EXECUTABLE} lib-freertos lib-hal-stm32h7xx)

サブモジュールをアプリケーション プロジェクトに「インポート」します。しかし、実行可能ファイルをビルドするとき、gcc はルート ディレクトリincludeにあるファイルstm32h7xx_hal_conf.hおよびFreeRTOSConfig.hにアクセスできません。構成ヘッダーは、構成が異なる複数のプロジェクトで使用されるため、サブモジュールに配置したくありません。ライブラリを親プロジェクトに追加した後、ライブラリの既に指定されているディレクトリ検索範囲を何とか拡張することは可能ですか?

プロジェクトのファイル構造:

-src
-include (configuration for lib-hal and lib-freertos included there)
 -lib-hal
  -includes...
  -sources...
 -lib-freertos
  -includes...
  -sources...

返信ありがとうございます。

4

1 に答える 1

0

Tsyvarev がコメントで述べたように、プロジェクト内のターゲットのプロパティを変更できます。物事をきれいに保つために、私は通常、このための関数を作成し、別のファイルに配置します。

ヒント: ソース ファイルをターゲットに追加することもできます。FreeRTOS の場合、すべてのプロジェクトが同じ MCU ファミリで実行されない場合に備えて、アーキテクチャ固有のファイルを追加できます。

function(configure_freertos target_name)
    target_sources(${target_name}
        PRIVATE
            lib-freertos/portable/GCC/ARM_CM7/r0p1/port.c
    )

    target_include_directories(${target_name}
        PUBLIC
            include
            lib-freertos/portable/GCC/ARM_CM7/r0p1
    )
endfunction()
于 2022-02-12T00:03:36.680 に答える