第一章:课程导论与实验环境准备

各位同学,欢迎来到《调试串口与网络配置》实战课程。我是你们这趟嵌入式Linux调试之旅的向导。说实话,做了十几年嵌入式,踩过的坑比吃过的盐还多。今天这第一课,咱们先把家伙事儿备齐——工欲善其事,必先利其器嘛。

1.1 嵌入式Linux调试全景图

调试嵌入式Linux系统,说白了就是跟硬件和内核打交道。你想想看,一个系统跑起来,从uboot引导、内核启动、文件系统挂载,到应用程序运行,每个环节都可能出问题。我习惯把调试分为三个层次:

  • 硬件层:电源、时钟、复位、内存颗粒——这些是基础,基础不稳地动山摇
  • 内核层:驱动加载、设备树解析、中断处理——这里出问题往往表现为死机或外设不工作
  • 应用层:进程崩溃、内存泄漏、网络不通——用户能直接感知的问题

而串口和网络,就是我们观察这三个层次的“眼睛”。没有串口,你连内核打印都看不到;没有网络,你连文件都传不上去。所以,搭建好调试环境,是后续所有工作的前提。

核心观点:调试环境搭建不是一次性的体力活,而是贯穿整个项目周期的基本功。环境越顺手,定位问题越快。

下面这张图,是我自己总结的嵌入式Linux调试知识体系,你可以把它当作整个课程的地图:

嵌入式Linux调试全景图 调试目标:快速定位与修复 串口调试 网络调试 逻辑分析/示波器 Bootloader阶段 内核启动阶段 文件系统/应用阶段 环境准备:硬件平台 + 虚拟机 + 串口/网络连接 说明:本课程重点覆盖串口调试与网络调试两大手段 逻辑分析/示波器作为辅助手段,在关键章节会穿插讲解

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也完全够用,看个人喜好。

安装步骤很简单,我快速过一遍:

  1. 下载Ubuntu 22.04 LTS桌面版ISO镜像
  2. 新建虚拟机,分配至少4GB内存、50GB硬盘
  3. 网络模式选择“桥接模式”——这样开发板和虚拟机就在同一个局域网了
  4. 安装系统,一路默认即可
  5. 安装完成后,执行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。交叉连接,别搞反了。

具体步骤:

  1. USB转串口模块插入电脑USB口
  2. 模块的GND接开发板的GND
  3. 模块的TX接开发板的RX
  4. 模块的RX接开发板的TX
  5. 开发板上电

在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。