第一章:课程导论与实验环境准备
各位同学,欢迎来到《调试串口与网络配置》实战课程。我是你们这趟嵌入式Linux调试之旅的向导。说实话,做了十几年嵌入式,踩过的坑比吃过的盐还多。今天这第一课,咱们先把家伙事儿备齐——工欲善其事,必先利其器嘛。
1.1 嵌入式Linux调试全景图
调试嵌入式Linux系统,说白了就是跟硬件和内核打交道。你想想看,一个系统跑起来,从uboot引导、内核启动、文件系统挂载,到应用程序运行,每个环节都可能出问题。我习惯把调试分为三个层次:
- 硬件层:电源、时钟、复位、内存颗粒——这些是基础,基础不稳地动山摇
- 内核层:驱动加载、设备树解析、中断处理——这里出问题往往表现为死机或外设不工作
- 应用层:进程崩溃、内存泄漏、网络不通——用户能直接感知的问题
而串口和网络,就是我们观察这三个层次的“眼睛”。没有串口,你连内核打印都看不到;没有网络,你连文件都传不上去。所以,搭建好调试环境,是后续所有工作的前提。
核心观点:调试环境搭建不是一次性的体力活,而是贯穿整个项目周期的基本功。环境越顺手,定位问题越快。
下面这张图,是我自己总结的嵌入式Linux调试知识体系,你可以把它当作整个课程的地图:
1.2 硬件平台准备
做嵌入式调试,你得先有一块能跑Linux的开发板。我个人建议初学者从以下平台入手:
| 平台 | 处理器架构 | 串口数量 | 网络接口 | 适合场景 |
|---|---|---|---|---|
| 树莓派3B/4B | ARM Cortex-A53/A72 | 1路UART(需GPIO引出) | 百兆/千兆以太网 | 入门学习、原型验证 |
| NXP i.MX6ULL | ARM Cortex-A7 | 8路UART | 百兆以太网 | 工业控制、驱动开发 |
| 全志V3s/F1C200s | ARM Cortex-A7 | 3路UART | 百兆以太网 | 低成本方案、裸机+Linux |
| Xilinx Zynq-7000 | ARM Cortex-A9 + FPGA | 2路UART | 千兆以太网 | FPGA+ARM协同、高级调试 |
我的建议:如果你刚开始接触嵌入式Linux,先搞一块树莓派或者二手i.MX6ULL开发板。别一上来就上Zynq,那玩意儿调试起来能把人整崩溃——我曾经在一个Zynq项目上花了整整两周才把串口调通,后来发现是PS端时钟配置错了。
除了开发板,你还需要一个USB转串口工具。市面上常见的方案有:
- CH340/CH341:便宜,驱动好找,适合初学者
- FT232:稳定,抗干扰能力强,我项目里一直用这个
- CP2102:体积小,适合嵌入式集成
注意:买USB转串口线时,一定要确认是3.3V电平的!5V的TTL电平会烧坏开发板的GPIO。我曾经见过一个实习生把5V的线直接怼到树莓派的UART上,结果...嗯,板子冒烟了。
1.3 虚拟机与Ubuntu环境搭建
开发环境我推荐用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为嵌入式Linux社区的工具链、文档、论坛,绝大多数都基于这两个版本。你非要用Arch Linux或者CentOS也不是不行,但遇到问题查资料时你会发现,90%的答案都是Ubuntu的。
虚拟机软件我选VMware Workstation Pro(收费)或者VirtualBox(免费)。我个人习惯用VMware,它的USB重定向和网络配置更稳定。不过VirtualBox也完全够用,看个人喜好。
安装步骤很简单,我快速过一遍:
- 下载Ubuntu 22.04 LTS桌面版ISO镜像
- 新建虚拟机,分配至少4GB内存、50GB硬盘
- 网络模式选择“桥接模式”——这样开发板和虚拟机就在同一个局域网了
- 安装系统,一路默认即可
- 安装完成后,执行
sudo apt update && sudo apt upgrade
装完系统后,有几个工具是必须装的:
sudo apt install build-essential git vim minicom net-tools openssh-server
小技巧:装完系统第一件事,把~/.bashrc里的HISTSIZE改大一点,比如HISTSIZE=10000。调试的时候你会频繁敲命令,历史记录太短的话,想找回之前敲过的命令都费劲。
1.4 串口与网络硬件连接
好,硬件和虚拟机都准备好了,接下来就是物理连接。这部分看着简单,但很多人第一次接的时候都会出问题。
串口连接
串口连接就三根线:TX、RX、GND。记住一个口诀:TX接RX,RX接TX,GND接GND。交叉连接,别搞反了。
具体步骤:
- USB转串口模块插入电脑USB口
- 模块的GND接开发板的GND
- 模块的TX接开发板的RX
- 模块的RX接开发板的TX
- 开发板上电
在Ubuntu虚拟机里,用ls /dev/ttyUSB*或ls /dev/ttyACM*查看设备节点。如果看不到,检查一下VMware的USB重定向设置——我遇到过好几次,虚拟机没把USB设备抢过来。
然后用minicom连接:
sudo minicom -D /dev/ttyUSB0 -b 115200
波特率115200是嵌入式Linux最常用的,但也有用57600或9600的,具体看你的uboot或内核配置。
避坑指南:我曾经在一个项目里,串口死活没输出。查了半天,发现是USB转串口模块的RTS引脚和开发板的某个GPIO冲突了。解决办法很简单——把RTS和CTS悬空,只接三根线。所以,如果你遇到串口没反应,先试试只接TX、RX、GND。
网络连接
网络连接有两种常见方式:
| 方式 | 连接方法 | 优点 | 缺点 |
|---|---|---|---|
| 直连路由器/交换机 | 开发板网口 → 路由器LAN口 | 配置简单,开发板可获取IP | 需要路由器,受网络环境影响 |
| 直连电脑 | 开发板网口 → 电脑网口(交叉线或自适应) | 独立网络,不受外部干扰 | 需要手动配置IP,虚拟机需桥接 |
我建议初学者用第一种方式——直连路由器。开发板通过DHCP获取IP,你在Ubuntu里用ping测试连通性就行。如果开发板没有DHCP客户端,可以在uboot里手动设置:
setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.10
saveenv
这里的serverip就是你Ubuntu虚拟机的IP地址。后面我们会用TFTP或NFS从虚拟机给开发板传文件,这个IP配置很关键。
我的习惯:我会在Ubuntu里把/etc/hosts文件加上开发板的IP和主机名,比如192.168.1.100 myboard。这样后面用SSH或TFTP时,直接敲ssh root@myboard就行,不用每次都记IP。