首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在嵌入式( CMake )项目结构中正确使用RP2040?

如何在嵌入式( CMake )项目结构中正确使用RP2040?
EN

Stack Overflow用户
提问于 2022-03-05 20:13:47
回答 1查看 837关注 0票数 0

TL;DR

如何以优雅的方式与包含的项目级库一起使用CMakeLists.txt?

引言

亲爱的Stack用户,

在我开始手工创建的构建系统(以前使用预先配置的STM32CubeIDE、SW4STM32和MSP430 CCS)之后不久,我通过使用Raspberry RP2040遇到了一个棘手的(主观上)使用CMake的任务。通过大量的教程、提示和问题(以及project生成器),我已经成功地构建了我的简单项目。然而,我觉得这是一种相当临时的方式。

环境

情况如何:我有一个使用RP2040 picoSDK的项目--一个外围配置函数的集合,一个存储在项目目录之外的某种类型的HAL。将picoSDK看作是外部库函数。使用这个picoSDK,我创建了一个使用多个外围设备的简单应用程序。我将我的项目划分为以下结构:项目结构

我的文件之间的连接如下:档案关系,其中我的main.c文件使用一个模块,模块使用两个外围设备。所有这些文件都需要访问全局定义,picoSDK包含在common.h文件中。

为了清晰起见,我在Windows 10上使用VS代码,我正在用arm-gcc 10.3.1编译,我的CMake版本是3.20.6

问题与当前解决方案

现在,我一直在尝试使用这个线程中的其他方法:带有子目录的CMake),在每个目录中使用多个CMakeLists.txt来创建基于o目录的库,然后在顶级CMakeLists.txt中使用add_subdirectory()添加它们,但是没有成功。我所做的工作的CMakeLists.txt以下列方式完成:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.13)

# [Platfrom specific command] Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)

project(ProjectName C CXX ASM)

# [Platfrom specific command] Initialize the Raspberry Pi Pico SDK
pico_sdk_init()

set(sources main.c
            Common.h
            Peripherals/PeripheralA.c
            Peripherals/PeripheralA.h
            Peripherals/PeripheralB.c
            Peripherals/PeripheralB.h
            Modules/ModuleSource.c
            Modules/ModuleSource.h
            Modules/ModuleConfig.h)
            
# Create executable with specified sources
add_executable(ProjectName ${sources})

# Add the standard library to the build (picoSDK inclusion)
target_link_libraries(ProjectName pico_stdlib)

# Add any user requested libraries (a part of picoSDK)
target_link_libraries( ProjectName
        hardware_timer
        )

免责声明:在特定情况下,添加特定于平台的行,这些问题落入精通RP2040的人手中。

问题是

现在,我觉得嵌入式域有点不同,因为我的项目的每个部分(外设、模块甚至主文件)都需要访问基础:驱动微控制器的库(picoSDK这里),因此我想问:建议的方法是什么,CMakeLists.txt内容的大纲是什么?我确信这个项目会发展壮大,而且根据其他回复,将所有内容都保存在一个CMakeLists.txt文件中是不建议的。

我正在寻找暗示,好的建议和批评。我非常感谢你花了很多时间阅读这篇文章,当然也很感谢你的回复。如果这个问题涉及的是一些琐碎的问题,或者是从熟练用户的角度来说已经没有意义的问题--请接受我的道歉。

EN

回答 1

Stack Overflow用户

发布于 2022-03-06 02:14:25

我能给您的最好的建议是将代码组织到库中。它将使代码解耦,并为单元测试、仿真、代码重用等提供机会。

在外设和模块中,绝对应该避免对common.h的依赖。

下面是一个示例,说明如何创建和链接库彼此以及主项目。

顶层CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.13)

# [Platfrom specific command] Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)

project(ProjectName C CXX ASM)

# [Platfrom specific command] Initialize the Raspberry Pi Pico SDK
pico_sdk_init()

# Create executable with specified sources
add_executable(ProjectName main.c)

add_subdirectory(Modules)
add_subdirectory(Peripherals)

# Peripherals depend on pico_stdlib only.
target_link_libraries(Peripherals PUBLIC pico_stdlib)

# Modules depend on peripherals only.
target_link_libraries(Modules PUBLIC Peripherals)

# Link direct dependencies of the project.
target_link_libraries(ProjectName
    PRIVATE
        Modules
        hardware_timer
)

外围设备/CMakeLists.txt

代码语言:javascript
复制
project(Peripherals)

add_library(${PROJECT_NAME})

target_include_directories(${PROJECT_NAME} ${PROJECT_SOURCE_DIR})

target_sources(${PROJECT_NAME}
    PRIVATE
        Peripherals/PeripheralA.c
        Peripherals/PeripheralA.h
        Peripherals/PeripheralB.c
        Peripherals/PeripheralB.h
)

模块/CMakeLists.txt

代码语言:javascript
复制
project(Modules)

add_library(${PROJECT_NAME})

target_include_directories(${PROJECT_NAME} ${PROJECT_SOURCE_DIR})

target_sources(${PROJECT_NAME}
    PRIVATE
        Modules/ModuleSource.c
        Modules/ModuleSource.h
        Modules/ModuleConfig.h
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71365643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档