Linux 嵌入式开发完整入门:工具、配置和学习路线
适合对象:想在 Linux 上从零开始搭建嵌入式开发环境的新手。你可能正在学习 STM32、ESP32、RISC-V、Linux 驱动、RTOS 或单片机裸机开发。
本教程不绑定某一个 IDE,而是讲清楚 Linux 嵌入式开发到底需要哪些工具、每个工具做什么、怎么配置。
1. Linux 嵌入式开发分几类
新手先分清自己属于哪一类。
| 类型 | 例子 | 主要工具 |
|---|---|---|
| 单片机裸机 | STM32、GD32、NXP、RISC-V MCU | arm-none-eabi-gcc、OpenOCD、GDB、CMake |
| RTOS | FreeRTOS、RT-Thread、Zephyr | CMake/West/SCons、GDB、串口工具 |
| 嵌入式 Linux 应用 | 树莓派、ARM Linux 板 | gcc/g++、交叉编译器、SSH、gdbserver |
| Linux 驱动 | 字符设备、I2C、SPI、内核模块 | kernel headers、make、dtc、交叉编译 |
| ESP32 | ESP-IDF | idf.py、CMake、Ninja |
如果你是 STM32 新手,看"单片机裸机"路线。
2. 推荐 Linux 发行版
新手推荐:
- Ubuntu 24.04 LTS。
- Ubuntu 22.04 LTS。
- Debian 12。
不建议一开始使用:
- Arch,滚动更新对新手不友好。
- Kali,它不是开发系统。
- 过老 Ubuntu,依赖版本容易不匹配。
3. 建议目录规划
text
~/embedded/
tools/ # 手动下载的工具链
projects/ # 自己的工程
sdk/ # ESP-IDF、Zephyr、厂商 SDK
docs/ # 数据手册、参考手册
scripts/ # 常用脚本
创建:
bash
mkdir -p ~/embedded/{tools,projects,sdk,docs,scripts}
4. 安装基础开发工具
Ubuntu / Debian:
bash
sudo apt update
sudo apt install -y \
git curl wget unzip xz-utils \
build-essential cmake ninja-build make pkg-config \
gdb gdb-multiarch \
python3 python3-pip python3-venv \
minicom screen picocom \
openocd \
udev
验证:
bash
git --version
gcc --version
cmake --version
ninja --version
python3 --version
openocd --version
5. 安装 ARM 裸机工具链
5.1 直接用 apt
bash
sudo apt install -y gcc-arm-none-eabi binutils-arm-none-eabi
验证:
bash
arm-none-eabi-gcc --version
arm-none-eabi-size --version
arm-none-eabi-objcopy --version
5.2 手动安装官方工具链
如果 apt 版本太旧:
- 去 Arm GNU Toolchain 官网下载 Linux x86_64 包。
- 解压到:
text
~/embedded/tools/
- 加入 PATH:
bash
nano ~/.bashrc
加入:
bash
export PATH="$HOME/embedded/tools/arm-gnu-toolchain/bin:$PATH"
刷新:
bash
source ~/.bashrc
6. 安装 OpenOCD
OpenOCD 用来连接调试器和芯片。
bash
sudo apt install -y openocd
测试 ST-LINK + STM32F1:
bash
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
成功标志:
text
Info : STLINK V2J...
Info : target halted
Info : Listening on port 3333 for gdb connections
常见 target:
text
STM32F1: target/stm32f1x.cfg
STM32F4: target/stm32f4x.cfg
STM32H7: target/stm32h7x.cfg
GD32: 有些可兼容 stm32 配置,有些需要单独配置
7. 配置 USB 权限
没有权限时会出现:
text
LIBUSB_ERROR_ACCESS
unable to open probe
解决:
bash
sudo usermod -aG plugdev $USER
sudo udevadm control --reload-rules
sudo udevadm trigger
有些工具链会提供 udev 文件,例如:
text
stlink.rules
openocd.rules
jlink.rules
复制到:
text
/etc/udev/rules.d/
然后重新插拔调试器,并重新登录。
8. 串口工具
嵌入式开发经常要看串口日志。
安装:
bash
sudo apt install -y minicom picocom screen
查看串口设备:
bash
ls /dev/ttyUSB*
ls /dev/ttyACM*
加入串口权限组:
bash
sudo usermod -aG dialout $USER
重新登录后使用:
bash
picocom -b 115200 /dev/ttyUSB0
退出 picocom:
text
Ctrl+A,然后 Ctrl+X
9. CMake 裸机工程基本结构
推荐结构:
text
blink/
CMakeLists.txt
cmake/
arm-none-eabi.cmake
src/
main.c
inc/
main.h
startup/
startup_stm32f103xb.s
linker/
STM32F103C8Tx_FLASH.ld
构建:
bash
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build
查看大小:
bash
arm-none-eabi-size build/firmware.elf
生成 bin:
bash
arm-none-eabi-objcopy -O binary build/firmware.elf build/firmware.bin
10. Makefile 裸机工程基本命令
有些老工程使用 Makefile:
bash
make
make clean
make flash
常见变量:
text
CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
SIZE=arm-none-eabi-size
CFLAGS=-mcpu=cortex-m3 -mthumb -O0 -g
LDFLAGS=-T linker.ld -Wl,--gc-sections
新手如果看不懂 Makefile,可以让 AI 解释:
text
请用中文解释这个 Makefile。
重点解释 CC、CFLAGS、LDFLAGS、SRCS、OBJS、flash 目标分别做什么。
11. GDB 基本调试流程
终端 1 启动 OpenOCD:
bash
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
终端 2 启动 GDB:
bash
arm-none-eabi-gdb build/firmware.elf
GDB 内输入:
gdb
target remote localhost:3333
monitor reset halt
load
break main
continue
常用命令:
gdb
next
step
continue
print variable_name
info registers
monitor reset halt
12. VS Code 可选配置
如果用 VS Code:
推荐扩展:
- C/C++。
- CMake Tools。
- Cortex-Debug。
构建任务:
json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "cmake --build build",
"group": "build",
"problemMatcher": "$gcc"
}
]
}
调试配置参考:
json
{
"name": "OpenOCD Debug",
"type": "cortex-debug",
"request": "launch",
"servertype": "openocd",
"executable": "${workspaceFolder}/build/firmware.elf",
"configFiles": [
"interface/stlink.cfg",
"target/stm32f1x.cfg"
],
"runToEntryPoint": "main"
}
13. CLion 可选配置
如果用 CLion:
- 配 Toolchain。
- 配 CMake Profile。
- 配 Embedded Development。
- 使用 OpenOCD Download & Run。
CLion 对 CMake 工程体验很好,适合:
- 想要强代码跳转。
- 想要图形化调试。
- 想看寄存器/外设视图。
- 不想手写太多 VS Code json。
14. STM32CubeMX 在 Linux 上怎么用
步骤:
- 安装 STM32CubeMX。
- 创建项目。
- 选择芯片。
- 配置
SYS -> Debug -> Serial Wire。 - 配置 GPIO/UART/SPI/I2C。
Project Manager -> Toolchain / IDE选择CMake。- 生成代码。
- 用 CLion 或 VS Code 打开。
新手一定要记住:
text
自己写的代码放在 USER CODE BEGIN/END 中。
15. ESP32 Linux 开发工具
ESP32 推荐官方 ESP-IDF。
大致流程:
bash
mkdir -p ~/embedded/sdk
cd ~/embedded/sdk
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
. ./export.sh
创建工程:
bash
idf.py create-project hello_world
cd hello_world
idf.py set-target esp32
idf.py build
idf.py flash monitor
串口权限同样需要 dialout 组。
16. Zephyr Linux 开发工具
Zephyr 使用 west。
基本流程:
bash
python3 -m venv ~/embedded/venv-zephyr
source ~/embedded/venv-zephyr/bin/activate
pip install west
west init ~/embedded/sdk/zephyrproject
cd ~/embedded/sdk/zephyrproject
west update
west zephyr-export
pip install -r zephyr/scripts/requirements.txt
构建示例:
bash
west build -b nucleo_f103rb samples/basic/blinky
west flash
17. 嵌入式 Linux 应用开发
如果目标板跑 Linux,例如树莓派、全志、瑞芯微、NXP i.MX:
常见方式:
text
PC Linux 写代码
|
交叉编译
|
scp 复制到开发板
|
ssh 登录运行
常用工具:
bash
sudo apt install -y ssh sshpass rsync
复制:
bash
scp app root@192.168.1.100:/root/
登录:
bash
ssh root@192.168.1.100
18. Linux 驱动开发基础工具
安装:
bash
sudo apt install -y linux-headers-$(uname -r) device-tree-compiler
内核模块常用命令:
bash
make
sudo insmod hello.ko
lsmod
dmesg -w
sudo rmmod hello
注意:驱动开发比单片机裸机更复杂,新手建议先学 C、Makefile、Linux 命令、指针、结构体。
19. 必备 Linux 命令
文件:
bash
ls
cd
pwd
cp
mv
rm
mkdir
tree
搜索:
bash
grep -R "HAL_GPIO" .
find . -name "*.c"
rg "HAL_GPIO"
进程:
bash
ps aux
kill
top
htop
权限:
bash
chmod +x script.sh
sudo usermod -aG dialout $USER
Git:
bash
git status
git diff
git add .
git commit -m "message"
20. 新手常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| command not found | 没安装或 PATH 不对 | 安装工具,检查 PATH |
| Permission denied | 没执行权限或 USB 权限 | chmod 或 udev/group |
| cannot open /dev/ttyUSB0 | 串口权限不够 | 加入 dialout |
| OpenOCD 连接失败 | cfg 错、接线错、权限错 | 分别排查 |
| undefined reference | 源文件没参与链接 | 检查 CMake/Makefile |
| multiple definition | 重复定义全局变量 | 头文件只声明 extern |
| hardfault | 指针、栈、时钟、中断问题 | 用 GDB 查 fault 寄存器 |
21. 推荐学习路线
第 1 阶段:Linux 基础。
- 会使用终端。
- 会安装软件。
- 会编辑文件。
- 会用 Git。
第 2 阶段:C 语言基础。
- 指针。
- 结构体。
- 位运算。
- volatile。
- static。
- 链接和作用域。
第 3 阶段:裸机开发。
- GPIO。
- UART。
- Timer。
- PWM。
- EXTI。
- ADC。
第 4 阶段:工程化。
- CMake。
- 模块拆分。
- 日志。
- 单元测试。
- Git 分支。
第 5 阶段:高级主题。
- FreeRTOS。
- DMA。
- 低功耗。
- Bootloader。
- OTA。
- 嵌入式 Linux。
22. 给 AI 的 Linux 嵌入式提示词
解释环境:
text
我是嵌入式新手,系统是 Ubuntu 24.04。
请检查这个工程需要哪些工具链。
请告诉我如何从零安装依赖、构建、烧录和打开串口。
回答要一步一步来,不要跳步。
查编译错误:
text
这是我的 Linux 嵌入式工程构建错误:
粘贴完整输出。
请先找第一条真正错误。
请区分是 C 语法错误、链接错误、工具链错误、权限错误还是路径错误。
学习代码:
text
请用小白能听懂的语言解释这个 STM32 main.c。
重点解释初始化顺序、while(1)、中断回调、USER CODE 区域。
23. 最后建议
Linux 嵌入式开发不要一开始追求"大而全"。最稳的顺序是:
text
LED 跑通
|
串口能打印
|
按键能输入
|
定时器能中断
|
工程能用 Git 保存
|
再上 RTOS / DMA / Bootloader
每一步都能编译、能下载、能看到现象,比复制一个复杂工程更重要。