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