1. 课程导论与硬件平台概览
各位同学好,我是你们这门课的老周。做嵌入式Linux驱动开发十几年了,踩过的坑比走过的路还多。今天咱们开始第一讲——先把Modbus网关这个产品本身搞清楚,再把硬件平台摸透,最后把开发环境搭起来。
说白了,这一章就是打地基。地基不牢,后面写驱动、调协议、搞移植,全得翻车。我见过太多人上来就撸代码,结果发现CPU选型不对、外设接口不够、交叉编译链版本不匹配……折腾两周又重来。咱们别走那个弯路。
1.1 Modbus网关产品定义
Modbus网关是什么?简单说,它就是一个协议翻译器。一头连着工业现场的老设备(比如PLC、传感器、变频器),这些设备大多走RS-485串口,用Modbus RTU/ASCII协议;另一头连着上位机或者云平台,走以太网,用Modbus TCP协议。
网关的核心任务就两个:协议转换和数据透传。我做过一个项目,现场有200多台Modbus RTU设备,上位机要求全部走TCP接入。如果没有网关,你得把每台设备的串口线拉到上位机,距离远、干扰大、成本高。有了网关,一根网线全搞定。
典型应用场景:
- 工厂自动化:PLC数据采集与监控
- 能源管理:电表、水表、气表的远程抄表
- 楼宇自控:空调、照明、电梯的集中控制
- 环境监测:温湿度、PM2.5、气体浓度传感器接入
嗯,这里要注意:Modbus网关不是简单的“串口转网口”硬件转换器。它内部跑着完整的协议栈,要处理从站地址映射、功能码转发、超时重试、异常响应。这些逻辑全在嵌入式Linux上实现,所以咱们这门课的核心就是——把Modbus协议栈移植到嵌入式Linux平台,并写好底层驱动。
1.2 硬件架构与选型分析
选CPU/MPU是硬件设计的第一步,也是最关键的一步。我个人的习惯是:先定软件需求,再反推硬件配置。别上来就盯着芯片参数看,先想清楚你的网关要跑什么。
| 需求维度 | 最低要求 | 推荐配置 | 选型理由 |
|---|---|---|---|
| CPU主频 | 200 MHz | 400 MHz - 1 GHz | 跑Linux内核+协议栈,200MHz勉强够,但留余量 |
| RAM | 32 MB | 64 MB - 128 MB | Modbus协议栈+多线程+日志,32MB容易爆 |
| Flash | 8 MB | 16 MB - 32 MB | 内核+根文件系统+应用,8MB太紧 |
| 串口数量 | 2路 | 4路以上 | 一路调试,其余接Modbus从站 |
| 以太网 | 1路百兆 | 1路千兆 | 百兆够用,千兆留未来扩展 |
我在项目中常用的是NXP i.MX6ULL和TI AM335x系列。这两款芯片生态成熟、资料多、Linux支持好。尤其是i.MX6ULL,单核Cortex-A7,800MHz主频,128MB DDR3,跑Linux 5.10内核非常稳。价格也合适,批量在30-40元人民币左右。
避坑指南:我曾经选过一款国产MPU,价格确实便宜,但Linux BSP(板级支持包)一塌糊涂,网卡驱动有bug,串口DMA不工作。折腾了两个月,最后还是换回了i.MX。所以我的建议是——做产品选型,生态比性能重要。Linux主线内核支持越好的芯片,你后面越省心。
1.3 外设接口详解
Modbus网关的外设接口,说白了就三大类:串口、以太网、扩展接口。咱们一个一个说。
1.3.1 串口(UART/RS-485)
这是Modbus RTU的物理层。嵌入式Linux下,串口驱动通常用ttymxc0、ttyS0这类设备节点。但要注意:MCU的UART是TTL电平,不能直接接RS-485总线。中间需要加一个收发器芯片,比如MAX3485或SP3485。
我习惯在硬件设计时,把每一路RS-485都加上自动收发切换电路。为什么?因为Linux串口驱动控制RTS引脚做方向切换,实时性不够,容易丢数据。自动收发电路用三极管和电容搭一个延时网络,硬件自动切换,软件不用管。这个技巧后面讲驱动时会细说。
1.3.2 以太网(Ethernet)
Modbus TCP走的就是标准以太网。嵌入式Linux下,以太网控制器通常挂载在内部MAC+外部PHY的方案上。比如i.MX6ULL内部有MAC,外部接一个LAN8720A PHY芯片,通过RMII接口连接。
这里有个坑:PHY芯片的复位时序。我遇到过一块板子,网口死活ping不通,查了两天发现是PHY复位引脚拉低时间不够,芯片没正常初始化。后来在设备树里加了reset-gpios和reset-delay-us属性,问题解决。
1.3.3 扩展接口
除了串口和网口,网关通常还需要:
- USB Host:接4G模块、Wi-Fi模块、U盘存储
- SDIO:接Wi-Fi/蓝牙模块
- I2C/SPI:接传感器、RTC时钟、EEPROM
- GPIO:接按键、LED指示灯、继电器
你想想看,如果网关要上云,没有4G模块怎么行?如果现场要本地存储日志,没有USB或SD卡怎么行?所以选型时,接口丰富度也是硬指标。
1.4 开发环境搭建
环境搭建是新手最容易卡住的地方。我见过有人花了一周装交叉编译工具链,结果版本不对,编译出来的程序在板子上跑不起来。咱们按步骤来,一步别跳。
1.4.1 交叉编译工具链
交叉编译,说白了就是在PC上编译出能在ARM板子上运行的二进制文件。PC是x86架构,板子是ARM架构,指令集不同,所以需要交叉工具链。
我推荐用Linaro GCC,版本选gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf。为什么选这个?因为7.5.0版本稳定,支持C++14,而且和Linux内核5.10的编译要求匹配。
# 下载并解压
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
# 设置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
# 验证安装
arm-linux-gnueabihf-gcc --version
注意:环境变量要写入~/.bashrc或/etc/profile,否则每次开新终端都要重新export。我习惯在项目根目录下放一个setenv.sh脚本,每次编译前source一下,干净利落。
1.4.2 TFTP与NFS服务配置
开发阶段,你不可能每次修改代码都重新烧写整个系统。太慢了。所以我们需要TFTP下载内核和设备树,NFS挂载根文件系统。这样,PC上编译完,板子直接从网络加载,秒级迭代。
先配TFTP:
# 安装TFTP服务器
sudo apt-get install tftpd-hpa
# 配置TFTP目录
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot
# 编辑配置文件 /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -c -s"
再配NFS:
# 安装NFS服务器
sudo apt-get install nfs-kernel-server
# 编辑 /etc/exports,添加一行
/opt/nfsroot *(rw,sync,no_subtree_check,no_root_squash)
# 创建根文件系统目录
sudo mkdir -p /opt/nfsroot
sudo cp -a /path/to/rootfs/* /opt/nfsroot/
# 重启服务
sudo systemctl restart nfs-kernel-server
板子端U-Boot启动参数设置:
setenv serverip 192.168.1.100 # PC的IP
setenv ipaddr 192.168.1.10 # 板子的IP
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/opt/nfsroot rw ip=192.168.1.10'
tftp 0x80800000 zImage
tftp 0x83000000 imx6ull-gateway.dtb
bootz 0x80800000 - 0x83000000
个人经验:第一次配NFS时,板子启动后如果卡在VFS: Unable to mount root fs,八成是NFS权限问题。检查/etc/exports里的no_root_squash有没有加,以及防火墙有没有放行NFS端口(2049)。我曾经被这个坑了整整一个下午。
1.5 本章知识体系总览
下面这张图把本章的核心知识点串起来了。你可以把它当作整个课程的路线图——后面每一章都会回到这张图里的某个模块。
这张图里,产品定义是出发点,硬件架构是载体,开发环境是工具。三者缺一不可。后面29章,咱们会一步步把这张图里的每个节点都展开、讲透、落地。