本帖最后由 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) 等项目。
|