打印
[开发工具]

用 Dev Containers 和 Docker 容器轻松搭建 APM32 开发环境

[复制链接]
110|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
susutata|  楼主 | 2024-11-10 20:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 susutata 于 2024-11-10 20:52 编辑

#申请原创# @21小跑堂


用 Dev Containers 和 Docker 容器轻松搭建 APM32 开发环境


## 01 前言
日常开发中,我们经常会遇到开发环境配置问题,比如操作系统、编译器、库文件等等。特别是在需要更换电脑或者重装系统的时候,要重新搭建好一个复杂的开发环境,更让人头疼。

如果能够将开发环境打包成一个镜像,然后在任何地方都能够快速部署,那将是一件多么美好的事情。`Docker` 就是这样一个工具,它可以帮助我们实现这个目标。当然,虚拟机也可以实现类似的功能,但是相比虚拟机,`Docker` 更加轻量级,启动速度更快,更加适合开发环境的搭建。从版本管理、维护便利性、跨平台等方面来看 `Docker` 更有着明显的优势。

那么 `Docker`是什么? “[Docker 是一个用于开发、交付和运行应用程序的开放平台](https://docs.docker.com/get-started/docker-overview/)。”,这是官方对 `Docker` 的定义。

而从嵌入式开发的角度来看,`Docker` 可以帮助我们快速搭建开发环境,让开发人员专注于开发工作,而不用担心环境配置问题。 除此之外,`Docker` 还可以配合 `Jenkins` 实现`CI/CD`,提高软件开发的质量和效率。下面将结合 `Dev Containers` 插件,介绍如何在 `Docker` 容器中轻松搭建 `APM32` 基础开发环境。



## 02 Docker容器搭建
### 嵌入式开发环境需求
`Docker` 环境的安装不是本文重点,大家可以参考其他文章进行安装。官方也提供了 `windows`、`mac`、`linux` 等多个平台的[安装教程](https://www.docker.com/),大家可以根据自己的需求选择合适的平台进行安装。这里主要介绍如何在 `Docker` 容器中搭建 `APM32` 开发环境。

在嵌入式开发中,我们通常需要以下工具:
- `CMake`:C/C++ 项目构建工具
- `ARM-GCC`:ARM 架构的交叉编译器
- `OpenOCD`:开源的调试工具
- `python`:Python
- `pip`:Python 包管理工具
- `kconfiglib`:Kconfig 配置工具

明确了开发环境的需求之后,就可以利用 `vscode` 的 `Dev Containers` 插件来搭建开发环境了。

### Dockerfile文件
`Dockerfile` 是一个文本文件,其中包含了构建 `Docker` 容器的指令。根据上述的工具需求,我们可以编写以下指令。

基础镜像和环境变量设置
使用 `ubuntu` 作为基础镜像,并设置环境变量。
# Use the ubuntu image as the base image
FROM ubuntu:22.04

# Set environment variables
ENV DEBIAN_FRONTEND=noninteractive

安装基础工具
安装 `build-essential`、`git`、`wget`、`curl`、`unzip`、`tar`、`xz-utils`、`python3`、`openocd` 等基础工具。
# Install packages
RUN set -eux \
    && apt-get update && apt-get install -y \
    build-essential git wget curl unzip tar xz-utils python3 openocd \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && exit 0
安装 `CMake`
# Install cmake
RUN set -eux \
    && wget https://github.com/Kitware/CMake/releases/download/v3.28.5/cmake-3.28.5-linux-x86_64.sh -q -O /tmp/cmake-install.sh \
    # && wget https://cmake.org/files/v3.28/cmake-3.28.5-linux-x86_64.sh -q -O /tmp/cmake-install.sh \
    && chmod u+x /tmp/cmake-install.sh \
    && mkdir /opt/cmake-3.28.5 \
    && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-3.28.5 \
    && ln -s /opt/cmake-3.28.5/bin/* /usr/local/bin \
    && cmake --version \
    && rm /tmp/cmake-install.sh
安装 `ARM-GCC`
# Set arm-none-eabi-gcc toolchain version
ARG TARGETPLATFORM
ARG BUILDPLATFORM
ARG TOOLS_PATH=/opt/gcc-arm-none-eabi
ARG ARM_VERSION=13.2.rel1

# Install ARM Toolchain
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then export ARM_ARCH=x86_64; \
    else export ARM_ARCH=aarch64; \
    fi \
    && echo "Downloading ARM GNU GCC for Platform: $ARM_ARCH" \
    && mkdir -p ${TOOLS_PATH} \
    && curl -Lo gcc-arm-none-eabi.tar.xz "https://developer.arm.com/-/media/Files/downloads/gnu/${ARM_VERSION}/binrel/arm-gnu-toolchain-${ARM_VERSION}-${ARM_ARCH}-arm-none-eabi.tar.xz" \
    && tar xf gcc-arm-none-eabi.tar.xz --strip-components=1 -C ${TOOLS_PATH} \
    && rm gcc-arm-none-eabi.tar.xz \
    && rm ${TOOLS_PATH}/*.txt \
    && rm -rf ${TOOLS_PATH}/share/doc \
    && ln -s ${TOOLS_PATH}/bin/* /usr/local/bin \
    && echo "export PATH=\$PATH:${TOOLS_PATH}/bin" >> /etc/profile \
    && arm-none-eabi-gcc --version
安装 `kconfiglib`
# Install python pip
RUN set -eux \
    && python3 --version \
    && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
    && python3 get-pip.py \
    && rm get-pip.py \
    && python3 -m pip install -U pip \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && exit 0

# # Install python packages
RUN set -eux \
    && pip3 --version \
    && pip3 install --upgrade pip setuptools wheel \
    && pip3 --version \
    && pip3 install kconfiglib \
    && exit 0

设置用户环境变量和工作目录
# Set OMNI_BASE environment variable
ENV OMNI_BASE=/workspace/omni

# Set the working directory
WORKDIR /workspace

# Set the default shell to bash
CMD ["/bin/bash"]

## 03 在容器中进行远程开发
### Dev Containers插件
在 `vscode` 中安装 [Dev Containers 插件](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers),然后在项目根目录下创建 `.devcontainer` 文件夹,并在该文件夹下创建 `devcontainer.json` 文件。`

### devcontainer.json文件
在 `devcontainer.json` 添加以下内容,这样通过 `Dev Containers` 创建的容器就会自动在 `vscode` 中安装以下插件:
- `twxs.cmake` :`CMake`插件
- `ms-vscode.cmake-tools`:`CMake Tools`插件
- `mcu-debug.debug-tracker-vscode`:`Debug Tracker`插件
- `mcu-debug.memory-view`:`Memory View`插件
- `mcu-debug.rtos-views`:`RTOS Views`插件
- `mcu-debug.peripheral-viewer`:`Peripheral Viewer`插件
- `marus25.cortex-debug`:`Cortex Debug`插件
- `Arm.keil-studio-pack`:`MDk v6`插件
- `ms-azuretools.vscode-docker`: `Docker`插件

{
    "name": "OMNI Dev Container",
    "privileged": true,
    "build": {
        "dockerfile": "Dockerfile",
        "context": ".."
    },
    "workspaceFolder": "/workspace",
    "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
    "customizations": {
        "vscode": {
            "extensions": [
                "twxs.cmake",
                "ms-vscode.cmake-tools",
                "mcu-debug.debug-tracker-vscode",
                "mcu-debug.memory-view",
                "mcu-debug.rtos-views",
                "mcu-debug.peripheral-viewer",
                "marus25.cortex-debug",
                "Arm.keil-studio-pack",
                "ms-azuretools.vscode-docker"
            ],
            "settings": {
                "terminal.integrated.shell.linux": "/bin/bash",
                "cmake.configureOnOpen": true,
                "cmake.generator": "Ninja"
            }
        }
    }
}

### 在容器中进行远程开发
何谓远程开发呢?就是将本地工作空间通过 `Dev Containers` 插件映射到容器中,然后在容器中进行开发,而对文件的修改会同步到本地工作空间。

在准备好上述的 `Dockerfile` 和 `devcontainer.json` 文件之后,启动 `Docker` ,然后在 `vscode` 中打开 [omni-sdk](https://github.com/LuckkMaker/omni-sdk?tab=readme-ov-file)项目,并通过 `dev container` 插件构建容器。


等待容器构建完成。


在 `dev container` 中利用已创建好的`Docker`容器环境构建和编译固件。


可以在任意 `CMake` + `ARM-GCC` 的项目中使用该 `Dockerfile` 和 `devcontainer.json` 文件,实现快速搭建开发环境。比如 [apm32-kconfig-example](https://github.com/LuckkMaker/apm32-kconfig-example) 等项目。


使用特权

评论回复
沙发
问天少年| | 2024-11-12 21:53 | 只看该作者
那是不是每次换新设备都要先安装Docker?

使用特权

评论回复
板凳
susutata|  楼主 | 2024-11-13 08:56 | 只看该作者
问天少年 发表于 2024-11-12 21:53
那是不是每次换新设备都要先安装Docker?

那是肯定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

31

帖子

3

粉丝