@[TOC] 嵌入式Linux应用开发快速入门(从零到第一个程序)
🎉 写给急着做产品的你 :本教程不堆砌理论,只讲 最快上路 的方法。我们用 现成的Ubuntu虚拟机 、USB ADB传输 、简单的编译命令 ,让你在 30分钟内 点亮开发板、跑起第一个
Hello World。每个步骤都配有 白话解释 、常见坑点 和 解决技巧。跟着做,你就能先跑通全流程,再去深究细节。
1. 课程目标 ------ 为什么我们可以"快"?
1.1 一句话白话
你不需要先成为Linux内核专家,也能 快速做出一个带屏幕、能控制LED、能远程读取温湿度的产品 。我们帮你绕过那些暂时不必要深究的知识(比如自己装系统、配置网络、写Makefile),让你 先看到成品,再按需补课。
1.2 "快"的三个秘诀
| 传统做法 | 我们的捷径 | 好处 |
|---|---|---|
| 自己下载Ubuntu镜像、手动安装、配置开发工具 | 直接使用我们配置好的 Ubuntu虚拟机(已装好交叉编译链、ADB、VSCode等) | 省去2小时装环境 |
| 用网线配置NFS、TFTP、固定IP | 只用 USB线 + ADB 传输文件和登录开发板 | 无需网络知识,即插即用 |
| 手写Makefile、解决依赖 | 直接用 arm-buildroot-linux-gnueabihf-gcc 单文件编译 | 命令极简,不会出错 |
1.3 课程口号
先跑通,再深究。
不要在一开始就被波特率、设备树、驱动框架吓退。你完全可以在 1小时内 做出第一个能跑在开发板上的程序。
2. 做什么产品 ------ 硬件框图与软件结构
2.1 最终产品功能
- ✅ 在开发板的 触摸屏 上点击图标,控制 LED 亮灭
- ✅ 屏幕上实时显示 温湿度传感器 的值
- ✅ 通过 微信小程序 远程控制LED和查看温湿度(MQTT + 云服务器)
2.2 硬件连接简图

2.3 软件分层(从上到下)
| 层次 | 组件 | 说明 |
|---|---|---|
| 微信小程序 | MQTT客户端 | 发送指令、接收数据 |
| 云端 | MQTT Broker | 转发消息(如阿里云IoT) |
| 开发板APP | 前台QT GUI | 显示界面、响应用户触摸 |
| 开发板APP | 后台服务(多线程) | 读取温湿度、控制LED、与云端通信 |
| 进程间通信 | JsonRPC / 共享内存 | 前后台交换数据 |
| 驱动层 | LED驱动、温湿度模块驱动 | 直接操作硬件 |
| 硬件 | LED、传感器 | 执行动作 |
💡 你目前只需要关注"驱动层之上的应用开发",驱动和内核已经由开发板厂家提供好了。
2.4 上机演示效果
- 上电后屏幕显示主界面,有"开灯"、"关灯"按钮
- 点击按钮,LED立即响应
- 温湿度数值每秒刷新一次
- 手机微信小程序上也能看到相同的数据并控制
3. 搭建开发环境 ------ 从网盘到Ubuntu启动
3.1 下载网盘资料

- 打开 百问网下载中心(网址见官方文档)
- 在左侧导航找到你的开发板型号(如
100ask_imx6ull_pro) - 下载 网盘资料(通常是一个百度网盘链接或BT种子)
- 重点获取以下内容:
02_开发工具/下的虚拟机镜像(推荐ubuntu18.04_vscode_imx6ull_pro_QT.7z)03_开发板使用手册/中的PDF04_源码/中的示例代码
3.2 安装必备软件(Windows端)
| 软件 | 用途 | 获取位置 |
|---|---|---|
| VMware Workstation 16 Player | 运行Ubuntu虚拟机 | 网盘 02_开发工具/Windows/VMwareWorkstation安装包 |
| MobaXterm | 串口终端、SSH工具 | 同上 |
| FileZilla | 文件传输(可选,ADB更方便) | 同上 |
| USB串口驱动 | 使电脑识别开发板串口 | 网盘 02_开发工具/Windows/USB串口驱动 |
⚠️ 注意:VMware Player 是免费的,足够使用。安装后如果提示许可证过期,不影响基本功能。
3.3 导入Ubuntu虚拟机


- 解压 下载的
.7z虚拟机压缩包(密码一般为123456) - 打开 VMware Player → 点击 "打开虚拟机"
- 选择解压后的
.vmx文件(如ubuntu18.04_vscode_imx6ull_pro.vmx) - 启动虚拟机,登录信息:
- 用户名:
book - 密码:
123456
- 用户名:
3.4 验证网络(必须能上网)

在Ubuntu终端中执行:
bash
ping news.qq.com -c 4
如果看到类似 64 bytes from ... 的输出,说明网络正常。
如果没有,请检查虚拟机网络设置为 NAT(默认就是NAT)。
3.5 更新Git仓库(获取最新代码)

bash
cd ~/Desktop/01_all_series_quickstart
git pull
如果提示 Already up to date. 说明已是最新。
💡 为什么用Git? 后续课程会不断更新代码,
git pull能让你轻松同步。
3.6 配套资料一览
下载后的目录结构(部分):

4. 连接开发板 ------ 两种方式:串口 + ADB
4.1 硬件连接图


- 电源线:开发板DC口接5V电源
- USB OTG线 :一端插开发板 OTG口 ,另一端插 电脑USB
- 用于ADB传输文件和shell登录
- USB转串口线(可选):用于查看内核启动日志,如果ADB够用可以不接
✅ 推荐:只用OTG线 + ADB,一条线解决文件传输和命令行登录,非常方便。
4.2 串口连接(调试用,可选)

参考手册《嵌入式Linux应用开发完全手册V5.2_xxx开发板》的 3.4 串口连接 章节:
- 使用 MobaXterm 打开对应COM口,波特率 115200
- 开发板上电后,串口会打印启动日志,最终显示
[root@100ask:/]#提示符
4.3 ADB连接 ------ 重点(推荐)
ADB(Android Debug Bridge)原本用于Android调试,但也可以用来与Linux开发板通信。我们用它来 传文件 和 执行命令。
4.3.1 给Ubuntu添加ADB支持
打开Ubuntu终端,依次执行:
bash
# 1. 检查是否已有adb
ls /usr/bin/adb
# 2. 如果没有,安装adb
sudo apt update
sudo apt install adb -y
# 3. 设置adb权限(重要!否则会报 no permissions)
sudo chmod a+x /usr/bin/adb
sudo chmod a+s /usr/bin/adb
# 4. 重启adb服务
sudo adb kill-server
⚠️ 常见错误 :执行
adb devices提示no permissions (user book is not in the plugdev group)。
解决方法 :就是上面第3步的chmod a+s让adb以root权限运行。
4.3.2 给开发板添加ADB支持(如果厂家已预装则跳过)
开发板出厂时可能已经支持ADB,验证方法:
在开发板串口终端执行:
bash
ls /usr/bin/adb
如果显示 /usr/bin/adb 则已支持。否则需要手动安装,步骤如下:
配图:U盘格式化选择FAT32
- 准备一个 FAT32 格式的U盘(不能是exFAT或NTFS)
- 在Ubuntu中找到
adbd_files目录(位于网盘02_开发工具/下) - 将整个
adbd_files目录复制到U盘 - U盘插入开发板,系统会自动识别(串口会打印类似
sda: sda1的消息) - 在开发板上挂载U盘并复制文件:
bash
mount /dev/sda1 /mnt
cd /mnt/adbd_files
cp * / -rf
dos2unix /lib/udev/rules.d/61-usb-adbd.rules
dos2unix /usr/bin/usb_config
dos2unix /etc/init.d/S99adbd
chmod +x /usr/bin/adb
chmod +x /usr/bin/adbd
chmod +x /usr/bin/usb_config
chmod +x /etc/init.d/S99adbd
reboot
4.3.3 在VMware中将OTG设备连接到Ubuntu

- 当开发板通过OTG线连接到电脑后,VMware可能会自动弹窗询问"将此设备连接到虚拟机还是主机",选择 连接到虚拟机(ubuntu18.04_vscode_imx6ull_pro)
- 如果没有弹窗,可以手动操作:
VMware菜单栏 → 可移动设备 → 找到Linux Foundation 100ASK_IMX6ULL→ 点击 连接
4.3.4 测试ADB通信
在Ubuntu终端执行:
bash
adb devices
如果看到类似下面的输出,说明成功:
text
List of devices attached
100ask_IMX6ULL device
然后就可以用ADB做很多事情:
| 命令 | 作用 |
|---|---|
adb shell |
登录开发板的命令行 |
adb push 本地文件 开发板路径 |
上传文件,如 adb push hello /root |
adb pull 开发板文件 本地路径 |
下载文件,如 adb pull /root/1.txt ./ |
5. 体验第一个程序 ------ Hello World
5.1 获取源码

源码位于 01_all_series_quickstart 仓库中:
bash
cd ~/Desktop/01_all_series_quickstart/04_嵌入式Linux应用开发基础知识/source/01_hello
ls
# 你会看到 hello.c
⚠️ 重要提醒 :不要在原始的Git仓库目录里直接编译!因为 git pull 可能会覆盖你的修改。正确的做法是 复制到新目录:
bash
mkdir ~/my_test
cp hello.c ~/my_test/
cd ~/my_test
5.2 编写代码(如果你没有hello.c,自己创建一个)
c
// hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello, world!\n");
return 0;
}
5.3 交叉编译
使用开发板配套的交叉编译工具链:
bash
arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
编译成功后,当前目录会生成 hello 可执行文件(ARM架构)。
💡 为什么不能直接用gcc? 因为Ubuntu的gcc生成的是x86程序,无法在ARM开发板上运行。交叉编译工具链会生成ARM指令。
5.4 上传到开发板
bash
adb push hello /root
输出类似:
text
hello: 1 file pushed. 0.3 MB/s (8408 bytes in 0.024s)
5.5 登录开发板并运行
bash
adb shell
# 此时提示符会变成 sh-5.0# 或 [root@100ask:/]#
/root/hello
你会看到:
text
Hello, world!
🎉 恭喜!你的第一个ARM Linux程序跑起来了!
5.6 常见问题排查
| 现象 | 原因 | 解决 |
|---|---|---|
adb push 报 device not found |
OTG线未连接或VMware未连接设备 | 检查USB线,在VMware菜单中手动连接 |
adb shell 提示 error: insufficient permissions |
adb权限未设置 | 执行 sudo chmod a+s /usr/bin/adb 并 adb kill-server |
编译时提示 arm-buildroot...gcc: command not found |
交叉编译工具链未安装或路径未加入PATH | 虚拟机已预装,检查 echo $PATH 是否包含 /usr/bin |
开发板上运行 hello 报 not found |
缺少动态链接库(静态编译可解决) | 使用 -static 重新编译:arm-buildroot...gcc -static -o hello hello.c |
6. 完整速查表 📋
6.1 环境信息速查
| 项目 | 值 |
|---|---|
| Ubuntu用户名/密码 | book / 123456 |
| 开发板IP(通过ADB不需要) | 无需配置 |
| 交叉编译工具链前缀 | arm-buildroot-linux-gnueabihf- |
| 第一个程序路径 | /root/hello |
| ADB常用命令 | adb devices, adb push, adb pull, adb shell |
6.2 日常开发流程(三句话)
- 写代码 → 在Ubuntu中用VSCode编辑
.c文件 - 编译 →
arm-buildroot-linux-gnueabihf-gcc -o 程序名 源码.c - 运行 →
adb push 程序名 /root→adb shell→/root/程序名
6.3 下一步学什么
| 你想做什么 | 去学对应的章节 |
|---|---|
| 控制LED | 04_编写APP操作硬件/01_GPIO |
| 读取温湿度 | 04_编写APP操作硬件/02_I2C(温湿度模块一般用I2C) |
| 显示图片/文字 | 04_编写APP操作硬件/03_LCD + Qt |
| 远程控制 | 06_实战项目/01_MQTT |
| 写驱动程序 | 04d_嵌入式Linux驱动开发基础知识 |
7. 自我检查
7.1 本文与文档相比,在哪3个方面有明显提升?
- 口语化 + 结构化:用"三步走"、"一句话白话"、"常见坑点"等方式,把枯燥的步骤变成容易记忆的流程,而不是简单罗列命令。
- 独立性强:无需读者频繁翻阅原手册,每个步骤(尤其是ADB权限设置、U盘复制细节)都给出了完整命令和解释,并且增加了"为什么这样做"的说明。
- 实用主义:明确区分"必做步骤"和"可选步骤"(如串口非必须),并给出了"先跑通再深究"的学习理念,让初学者不会被吓退。
7.2 仍有哪个知识点自己觉得解释得不够清楚?为什么?
ADB 的 chmod a+s 原理 :虽然给出了命令,但没有深入解释 setuid 位的作用以及为什么 adb devices 需要 root 权限。原因是这部分涉及Linux用户和权限管理,对纯新手可能超纲,而"照着敲就能通"的策略在本教程中更合适。后续可以在进阶篇中补充 setuid 和 plugdev 组的详细说明。
🎉 你已经完成了第一个嵌入式Linux应用程序!接下来,可以挑战点亮LED或读取温湿度传感器了。
记住:先跑通,再深究。动手才是最快的进步方式!