返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

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

[复制链接]
 楼主| 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` 基础开发环境。

enter_docker.png

## 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` 作为基础镜像,并设置环境变量。
  1. # Use the ubuntu image as the base image
  2. FROM ubuntu:22.04

  3. # Set environment variables
  4. ENV DEBIAN_FRONTEND=noninteractive

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

  6. # Install ARM Toolchain
  7. RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then export ARM_ARCH=x86_64; \
  8.     else export ARM_ARCH=aarch64; \
  9.     fi \
  10.     && echo "Downloading ARM GNU GCC for Platform: $ARM_ARCH" \
  11.     && mkdir -p ${TOOLS_PATH} \
  12.     && 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" \
  13.     && tar xf gcc-arm-none-eabi.tar.xz --strip-components=1 -C ${TOOLS_PATH} \
  14.     && rm gcc-arm-none-eabi.tar.xz \
  15.     && rm ${TOOLS_PATH}/*.txt \
  16.     && rm -rf ${TOOLS_PATH}/share/doc \
  17.     && ln -s ${TOOLS_PATH}/bin/* /usr/local/bin \
  18.     && echo "export PATH=\$PATH:${TOOLS_PATH}/bin" >> /etc/profile \
  19.     && arm-none-eabi-gcc --version
安装 `kconfiglib`
  1. # Install python pip
  2. RUN set -eux \
  3.     && python3 --version \
  4.     && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
  5.     && python3 get-pip.py \
  6.     && rm get-pip.py \
  7.     && python3 -m pip install -U pip \
  8.     && pip3 --version \
  9.     && pip3 install --upgrade pip setuptools wheel \
  10.     && pip3 --version \
  11.     && exit 0

  12. # # Install python packages
  13. RUN set -eux \
  14.     && pip3 --version \
  15.     && pip3 install --upgrade pip setuptools wheel \
  16.     && pip3 --version \
  17.     && pip3 install kconfiglib \
  18.     && exit 0

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

  3. # Set the working directory
  4. WORKDIR /workspace

  5. # Set the default shell to bash
  6. 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`插件

  1. {
  2.     "name": "OMNI Dev Container",
  3.     "privileged": true,
  4.     "build": {
  5.         "dockerfile": "Dockerfile",
  6.         "context": ".."
  7.     },
  8.     "workspaceFolder": "/workspace",
  9.     "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
  10.     "customizations": {
  11.         "vscode": {
  12.             "extensions": [
  13.                 "twxs.cmake",
  14.                 "ms-vscode.cmake-tools",
  15.                 "mcu-debug.debug-tracker-vscode",
  16.                 "mcu-debug.memory-view",
  17.                 "mcu-debug.rtos-views",
  18.                 "mcu-debug.peripheral-viewer",
  19.                 "marus25.cortex-debug",
  20.                 "Arm.keil-studio-pack",
  21.                 "ms-azuretools.vscode-docker"
  22.             ],
  23.             "settings": {
  24.                 "terminal.integrated.shell.linux": "/bin/bash",
  25.                 "cmake.configureOnOpen": true,
  26.                 "cmake.generator": "Ninja"
  27.             }
  28.         }
  29.     }
  30. }

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

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

等待容器构建完成。
Pasted image 20241110194349.png

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

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


打赏榜单

21小跑堂 打赏了 50.00 元 2024-11-14
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

使用Docker容器管理开发环境镜像,避免每次跟换设备带来的开发环境配置问题,快速部署,节省人力。配置过程清晰,步骤拆分合理。  发表于 2024-11-14 18:22
问天少年 发表于 2024-11-12 21:53 | 显示全部楼层
那是不是每次换新设备都要先安装Docker?
 楼主| susutata 发表于 2024-11-13 08:56 来自手机 | 显示全部楼层
问天少年 发表于 2024-11-12 21:53
那是不是每次换新设备都要先安装Docker?

那是肯定
我想看大海 发表于 2024-11-16 17:48 | 显示全部楼层
应该是需要的开发环境越多用这个越好,一两个没多大必要
LEDyyds 发表于 2024-11-20 20:24 | 显示全部楼层
我这种只用一个KEIL的什么都不怕
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

32

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部