3. 目标硬件与RTOS环境评估

emNet 是一个可裁剪的嵌入式 TCP/IP 协议栈,它的资源占用与运行行为高度依赖目标硬件和 RTOS 环境。在真正把 emNet 源码加入工程之前,必须先回答三个问题:MCU 的 RAM/ROM 是否够用、以太网 MAC 与 PHY 是否满足 emNet 的驱动模型、RTOS 能否提供 emNet 需要的任务与同步原语。本节围绕这三条主线展开,并给出一份可直接填写的前置检查清单。

一、RAM 与 ROM 的评估方法

emNet 的内存占用分为两部分:协议栈自身的数据结构与缓冲区,以及由应用配置决定的收发缓冲。协议栈代码与常量表占用 ROM,通常与启用的协议模块数量相关;RAM 则主要由 socket 数量、ARP 表、路由表、TCP 窗口和收发缓冲决定。评估时不要只看编译后的 map 文件,而应先按配置估算,再留出余量。

一个可操作的估算方式是:先确定应用需要同时打开的 socket 数量 N,再确定每个 socket 的最大报文长度 MSS 与接收窗口。emNet 的收发缓冲通常按“缓冲块数量 × 块大小”组织,块大小应不小于最大以太网帧(1518 字节)或应用层最大报文。若使用 4 个 TCP socket、每 socket 2 个 1536 字节缓冲块,仅收发缓冲就约 12 KB;再加上 ARP 表、IP 路由表、TCP 控制块和 RTOS 对象,RAM 需求通常在 20~40 KB 量级。ROM 方面,仅启用 IP、ICMP、UDP、TCP 时,典型 Cortex-M 目标上代码约 30~60 KB,若加入 DHCP、DNS、HTTP 等模块会继续增加。

判断依据不是“能不能编译通过”,而是“最坏情况下是否仍有余量”。建议 RAM 预留至少 20% 余量,ROM 预留至少 15% 余量,并把栈空间单独计算:emNet 内部任务栈、应用任务栈、中断栈三者不能混为一谈。

二、MAC 与 PHY 的适配要求

emNet 通过驱动层访问以太网控制器,因此 MCU 必须提供可用的 MAC 外设,或通过外部 MAC 芯片扩展。评估时要确认三点:MAC 是否支持 DMA 描述符收发、是否支持中断或轮询模式、是否有可用的 PHY 接口(MII 或 RMII)。PHY 侧则要确认自协商、链路状态寄存器和时钟来源。若使用 RMII,必须保证 50 MHz 参考时钟由 MCU 或外部晶振稳定提供,否则会出现链路时通时断。

下面这张图把“MCU 资源—MAC/PHY—RTOS—emNet”之间的适配关系集中呈现出来,便于在选型阶段逐项核对。

MCU / RTOS / emNet 适配关系评估图 MCU 资源 RAM:协议栈 + 缓冲 + 栈 ROM:代码 + 常量表 MAC:DMA / 中断 / 描述符 PHY:MII / RMII / 时钟 时钟:HCLK / 参考时钟 RTOS 环境 任务:emNet 主任务 + 应用任务 同步:信号量 / 互斥量 / 事件 时间:系统节拍 / 延时精度 中断:ISR 与任务通信方式 栈:各任务独立栈空间 emNet 适配要求 驱动接口:MAC 收发回调 缓冲管理:块大小 / 块数量 RTOS 抽象:任务 / 信号量 定时器:TCP 重传 / ARP 老化 配置:IP / 掩码 / 网关 集成前置检查清单(逐项确认) □ RAM 估算:socket 数 × 缓冲块 + 栈 + 余量 ≥ 20% □ ROM 估算:协议模块 + 驱动 + 余量 ≥ 15% □ MAC 支持 DMA 描述符与中断收发 □ PHY 自协商正常,RMII 参考时钟稳定 □ RTOS 提供信号量 / 互斥量与任务延时 □ 中断优先级与 RTOS 临界区兼容 □ emNet 配置与硬件地址、IP 参数一致 □ 已准备最小回环 / ping 验证用例

三、RTOS 选型:embOS 与其他 RTOS 的取舍

emNet 与 SEGGER embOS 同源,配合使用时任务、信号量、定时器等抽象层已经过验证,集成路径最短。若项目已使用 FreeRTOS、ThreadX 或裸机调度,也并非不能使用 emNet,但需要自行实现或适配 OS 抽象层。评估时重点看四项能力:任务创建与删除、二值/计数信号量、互斥量(带优先级继承)、以及毫秒级延时或系统节拍。若 RTOS 缺少优先级继承,emNet 内部对共享缓冲的互斥需要额外保护,否则在高优先级任务频繁发送时可能出现优先级反转。

另一个容易被忽略的点是中断与 RTOS 的交互。emNet 的 MAC 驱动通常在中断中接收帧,再把帧交给协议栈任务处理。如果 RTOS 的中断屏蔽策略与 MAC 中断优先级冲突,会出现丢帧或死锁。建议把 MAC 中断优先级设为低于 RTOS 系统节拍中断,或在 ISR 中只做最小处理,通过信号量唤醒协议栈任务。

四、集成前置检查清单的使用方式

下面给出一份可直接填写的检查表,字段包括检查项、目标值/要求、实测或确认结果、结论。建议在硬件打样后、协议栈移植前完成第一轮填写,移植后再复核一次。

检查项 目标值 / 要求 确认结果 结论
可用 RAM ≥ 估算值 × 1.2 例如 48 KB 通过 / 不通过
可用 ROM ≥ 估算值 × 1.15 例如 256 KB 通过 / 不通过
MAC 收发方式 DMA 描述符 + 中断 已确认 通过 / 不通过
PHY 接口与时钟 RMII,50 MHz 稳定 示波器确认 通过 / 不通过
RTOS 同步原语 信号量、互斥量可用 已确认 通过 / 不通过
中断优先级 MAC 中断低于系统节拍 已配置 通过 / 不通过
emNet 配置 IP、掩码、网关、MAC 地址 已填写 通过 / 不通过
最小验证用例 ping 或回环测试 已准备 通过 / 不通过
提示:若使用 embOS,可直接复用 SEGGER 提供的 emNet 移植层;若使用其他 RTOS,建议先写一个只包含“创建任务 + 信号量收发”的最小工程,确认 OS 抽象层无误后再接入 MAC 驱动,这样能把问题定位在更小的范围内。
注意:不要用“编译通过”代替资源评估。emNet 的缓冲块数量、TCP 窗口和 socket 数量都会显著改变 RAM 占用,必须在配置确定后重新核算一次,并保留最坏情况下的余量。

完成以上评估后,你会得到一份明确的结论:当前 MCU 与 RTOS 是否满足 emNet 的运行条件,哪些项需要调整配置或更换选型。这份结论将直接决定后续移植工作的起点和风险等级。