1. 为什么我在这个项目里一眼相中SMARC形态
做嵌入式硬件这行久了,你会发现一个规律:需求千奇百怪,但载体来来回回就那几种。前几年我接过一个边缘网关的活,客户要求"能跑Linux、接口要全、功耗尽量低、最好能快速迭代",最关键的是他们连最终外壳尺寸都没定死,只给了一句话:"先出个能跑的板子看看效果。"
这种需求最折磨人。如果直接画一个核心板加底板的两板方案,底板一改,核心板就得跟着动,周期根本扛不住。当时我第一反应就是SMARC模块——这玩意儿天生就是干这个的。
1.1 SMARC标准的核心参数与设计逻辑
SMARC(Smart Mobility ARChitecture)标准由SGET组织维护,主打的就是小尺寸和低功耗。我常用的是2.0标准下的Short Size规格,尺寸只有82mm x 50mm,比一张名片大不了多少。别小看这块面积,上面要塞下处理器、内存、eMMC存储、电源管理、还有一堆高速接口。
接口方式也很有意思,SMARC用的是314pin的金手指连接器,而不是板对板连接器。第一次用的时候我还担心这种连接器会不会不牢靠,但实际用了几个项目之后发现,它的插拔力和抗震性都比想象中靠谱,而且公差控制得很好,底板上加两个定位柱就非常稳固。
SMARC还有几个设计细节值得夸一下。载板上的接口定义是标准化的:电源、DisplayPort/eDP/HDMI/LVDS显示接口统一在特定引脚上,PCIe/USB/SATA这些高速信号也有固定位置,I2C、SPI、UART这些低速控制信号分布在边缘引脚。这意味着什么?意味着我换一个不同芯片的SMARC模块,底板几乎不用动。去年我从一个i.MX8M Mini的模块切到i.MX8M Nano的模块,底板只改了一处电源使能的时序电阻,其他全部复用。
1.2 三大模块标准选型对比,SMARC赢在哪
做嵌入式的都知道,除了SMARC,还有Qseven和COM Express这两个主流标准。我做了个对比表,方便大家直观感受:
| 指标 | SMARC | Qseven | COM Express |
|---|---|---|---|
| 典型尺寸 | 82x50mm(Short) | 70x70mm | 95x95mm起 |
| 连接器 | 314pin金手指 | 230pin金手指 | 440pin板对板 |
| 功耗定位 | 3.5W-15W | 3.5W-12W | 12W以上 |
| 主要面向 | 电池供电、紧凑型设备 | 紧凑型设备 | 高性能计算、工控整机 |
| 散热方案 | 被动散热 | 被动散热 | 主动散热为主 |
| 接口丰富度 | 高(显示/PCIe/USB齐全) | 中 | 极高 |
Qseven和SMARC其实定位挺接近,但Qseven的连接器引脚少,PCIe通道也少,扩展性差点意思。COM Express虽然性能上限高,但尺寸大、功耗高,根本不适合我做这个低功耗项目。SMARC卡在中间这个位置刚刚好:接口够用、功耗够低、尺寸讨喜。
另外还有一个容易被忽略的点——车载和轨道交通行业的认可度。SMARC早期的标准定义就是从智能移动设备方向入手的,所以很多车载、医疗设备厂商对SMARC生态非常熟悉,供应链和设计参考都很成熟。这个项目虽然是个边缘网关,但客户后续有车载部署的打算,选SMARC等于提前铺了路。
2. i.MX8M Nano这颗芯片的功耗账,我是这样算明白的
说实话,i.MX8M Nano这颗料在项目初期我犹豫过一阵。那时候i.MX8M Mini出货量更大,网上资料也更多,Nano出来得晚一点,资料相对少。但把两颗芯片的数据手册和勘误表翻完之后,我发现Nano这颗料才是这个项目的正解。
2.1 从芯片规格书里读出关键信息
i.MX8M Nano采用14nm FinFET工艺制造,核心配置是4个Cortex-A53大核加1个Cortex-M7协处理核,最高主频1.5GHz。集成了一颗0.75 TOPS算力的NPU(神经网络处理单元),支持TensorFlow Lite和ONNX runtime这类主流推理框架。
先从数字讲讲为什么它低功耗:
| 工作状态 | 典型功耗 | 说明 |
|---|---|---|
| 全核满载 | 约2.5W-3.5W | 4个A53跑Dhrystone基准 |
| 待机(Linux idle) | 约0.7W-1.0W | 关闭外设、CPU降频 |
| 深度睡眠(Suspend) | 约0.05W-0.1W | DDR自刷新、内核保留 |
注意,这个功耗数值是模块级的典型值,也就是包含DDR和eMMC的基础功耗。实际设计里,我把显示接口走eDP外接一块小屏幕、同时开启NPU做推理时,整模块功耗也才4.5W左右。这个数字放到工业设备里非常能打,更何况大部分场景根本跑不满四核。
2.2 i.MX8M全家族的选型定位:Nano不是低配,是精准卡位
很多人一看到Nano这个词,就觉得它比Mini低一档。其实不完全对。i.MX8M系列四兄弟的定位是这样的:
- i.MX8M:老款,28nm工艺,功耗高,现在新设计基本不推荐了
- i.MX8M Mini:均衡之选,A53核多一个GPU Mali-G31,适合带界面渲染的应用
- i.MX8M Nano:去掉GPU,加了NPU,把节省下来的功耗和晶片面积留给AI推理
- i.MX8M Plus:性能最强,带双核NPU(2.3 TOPS),有ISP和Hi-Fi4 DSP,适合高端视觉应用
所以Nano的核心逻辑是"我不要花里胡哨的图形渲染,我要把每一毫瓦都花在刀刃上——NPU推理和实时控制"。如果项目需要Android系统或者复杂UI动效,Nano确实不太合适,GPU缺失的短板会很明显。但如果跑Yocto Linux或者Debian,做工业HMI加AI识别,Nano是完完全全够用的,而且因为少了GPU,整体发热更低。
前几周用GLMark2测了一下图形性能,OpenGL ES 2.0大概只有Mini的40%,但这不重要——我的场景里根本没跑3D渲染。倒是NPU跑Mobilenet SSD模型,输入尺寸300x300,推理时间稳定在52ms左右,这个性能做实时检测完全够用。
2.3 Cortex-M7协处理器在低功耗里的妙用
i.MX8M Nano上一个很容易被忽略的组件是Cortex-M7协处理器,运行在800MHz。这颗M7在标准BSP里通常跑的是FreeRTOS或裸机代码,可以和A53侧共享内存做核间通信。
我做低功耗设计时,M7是个非常香的资源。系统大部分时间A53侧的Linux处于suspend状态,M7还醒着,负责轮询几个传感器、通过I2C读数据、哪怕做个简单的CAN报文转发都不在话下。等有需要A53处理的数据了,再通过握手信号把A53叫醒,干完活再睡回去。这套机制让整机平均功耗降到了1W以内,客户看了实测数据直说"这已经接近单片机产品的功耗水平了"。
3. 硬件设计上最花心思的不是处理器,而是供电树和DDR布局
芯片确定之后,我原本以为硬件设计会轻松一些,毕竟Nano引脚不算特别多。但真正动手画板子的时候才发现,低功耗平台的硬件难点根本不在芯片本身,而是在供电架构和DDR走线这两个地方。
3.1 供电树设计:每一毫瓦都算清楚
i.MX8M Nano虽然标称电压范围宽,但实际上需要多路独立电源轨,而且各路电源之间有时序要求。我设计时的电源树结构大致如下:
| 电源轨 | 电压 | 主要负载 | 典型电流 |
|---|---|---|---|
| VDD_SOC | 0.8V-0.9V | A53核、NPU | 2A-3A |
| VDD_DRAM | 1.1V | LPDDR4 | 0.5A-0.8A |
| NVCC_DRAM | 1.8V | DDR IO | 0.3A |
| VDD_3V3 | 3.3V | 载板外设 | 由载板决定 |
| VDD_5V | 5V | 模块主输入 | 总输入电流 |
这里有个常人容易踩的坑:VDD_SOC归VDD_SOC,VDD_ARM归VDD_ARM,如果你把两个引脚直接短接起来,确实能亮机,但PMIC的负载检测和动态调压就会失效。NXP原厂的PCA9450A PMIC自带6路BUCK和6路LDO,专门为i.MX8M系列的电源时序设计,我就是用这颗PMIC做电源管理,让SOC、DDR、IO各路电源按照datasheet要求的时序上电和掉电。
实测下来,PCA9450A的DC-DC转换效率在负载30%以上时能到90%以上,比用分立LDO的方案省了不少热量。LDO虽然便宜、纹波低,但在大电流场景下压差功耗就是烧电的元凶。所以在设计时我把所有大电流负载全部挂在BUCK上,LDO只给RTC、M7调试口这类微小电流的设备供电。
3.2 LPDDR4布局布线的血泪经验
i.MX8M Nano支持LPDDR4和DDR4两种内存。做SMARC模块这种小尺寸产品,我首选LPDDR4,原因很直接:LPDDR4采用双通道16bit架构,工作电压只有1.1V,比DDR4的1.2V再降一点,而且封装更小,适合贴片。选型用的是Micron的MT53E256M32D1,单芯片容量2GB,模块上做了4片,共8GB内存。
LPDDR4的走线是我这次画板子最头疼的部分之一。数据线DQS/DQ组内的等长要求非常严格,DQS与DQ之间的偏差要控制在±1.5ps以内,这在高密度PCB上非常苛刻。换算成物理长度,大概就是0.2mm-0.3mm的误差空间,稍微粗心一点就出界了。
我的处理办法是用Cadence Allegro的constraint manager统一管理等长规则,给每一组信号创建Match Group组,然后通过时序仿真软件算出实际允许的物理长度偏差。实际布线时,DDR部分走了4个内层,GND和VDD_DRAM参考层做了完整的开槽处理,避免回流路径被割断。第一批板子回来之后做信号完整性测试,用示波器查看DQS信号,眼图非常干净,误码率测试跑了一个通宵零错误。
3.3 金手指连接的载板堆叠与信号完整性
SMARC模块的金手指连接器是插在底板上的,这种构造天然会带来一个信号完整性问题:连接器引脚本身引入了寄生电容和电感。在高速信号(比如PCIe、USB3.0、eDP)上,如果底板布线不做阻抗补偿,很容易造成回波损耗超标。
我在载板上做eDP和PCIe走线时,特意预留了串联电阻和共模电感的位置。早期调试时,eDP屏幕偶尔闪屏,我把串联电阻从0欧换到10欧之后,信号振铃明显改善,闪屏也消失了。这个经验后来成了我审核底板设计的关键检查项之一。
4. 软件层面让功耗真正降下来:内核、文件系统与运行时策略
硬件只是把功耗上限框住了,真正决定实际功耗曲线的是软件。同样的硬件,不做调优的Linux系统整机功耗可能跑在2W以上,经过内核定制和应用优化之后可以压到1W以内。这一章我重点讲讲我都做了哪些"软"活。
4.1 内核配置和CPU调频调压策略
NXP官方Yocto BSP已经支持了cpufreq和devfreq框架,但默认配置偏保守,很多省电选项没有全开。我做了三处改动:
第一处,替换CPU governor为ondemand或者schedutil。NXP BSP默认的governor是performance,也就是CPU始终保持最高频率。我改成schedutil之后,A53核在空闲时会降到600MHz,满载时自动boost到1.5GHz。实测空载功耗从0.95W降到了0.7W,下降幅度肉眼可见。
第二处,打开cpuidle深度状态。4个A53核的空闲深度休眠状态是WFI(Wait For Interrupt),但默认idle状态可能只进入浅睡。通过设置/sys/devices/system/cpu/cpuX/cpuidle/state*/disable,让CPU在空闲时进入更深的睡眠state。这里要注意——如果你打开了CPU的深度idle,中断响应延迟会从几十微秒涨到几百微秒,对硬实时任务有影响。所以我用taskset把实时任务绑在M7核上,A53随便睡。
第三处,是devfreq调频。DDR的频率也可以动态调整,LPDDR4在800MHz到1600MHz之间分档。在系统负载低的时候,DDR频率降到800MHz,DPLL(数字锁相环)的功耗也能省不少。NXP的devfreq驱动里已经实现了自动调频,但需要设备树的"operating-points-v2"属性配好,否则默认锁在最高频率。
4.2 Suspend/Resume机制的针对性调优
边缘设备大部分时间不是满负荷干活的,而是在等待触发事件。所以Suspend/Resume机制的优化直接决定了平均功耗能压到多低。
i.MX8M Nano的suspend流程,我借助了NXP的Linux内核power management框架:系统进入suspend时,会关闭UART、以太网PHY、USB PHY的供电,将LPDDR4切到自刷新模式,CPU进入WFI状态。实测在外部触发中断(比如GPIO唤醒)到来之前,整板功耗能稳定在环境温度下0.06W-0.08W。这在工业产品里几乎是"关机"级别的功耗。
但有个坑得提一下:以太网PHY的WOL(Wake on LAN)功能默认是关的。如果设备需要通过网络唤醒,必须在驱动里把phy的wakeup能力打开,同时把MAC的Magic Packet作为唤醒源挂到interrupt controller里。我第一次调的时候没注意这个配置,在底板上敲魔术包怎么都唤不醒,最后追查到PMIC的RTC中断把系统唤醒了,但网络路径没接上。折腾了一晚上才搞定。
4.3 文件系统层面的小优化同样有效
文件系统也能省电可能很多人没想到。我用Yocto构建了一个精简的只读根文件系统,基于BusyBox加一些核心工具,整个rootfs压缩后只有50MB左右。好处有三点:
一是少了后台守护进程,没有cron、没有logrotate轮转、没有PackageKit扫依赖,CPU空闲率会更高;二是只读挂载能减少对eMMC的写入,延长Flash寿命的同时降低了eMMC的工作频率;三是启动时间大幅缩短,从按下电源键到进入应用主进程,实测约4.2秒,这对需要快速响应的现场设备很有价值。
4.4 量测功耗的完整方法
最后聊聊功耗怎么测。很多人拿着万用表串在电源线上读一个数就算完事,这在低功耗项目里完全没有参考意义——因为功耗是时变的,瞬时电流可能差异很大。
我用的办法是:在DC-DC模块输入端串联一个0.1欧姆的采样电阻,同时把采样电阻两端的差分电压接到一个高精度ADC上,采样率设成10kHz,然后用脚本连续记录24小时。导出数据之后用Python算平均值、P99峰值和电量消耗。这个办法虽然土,但结果非常可靠,比市面上几千块钱的功率分析仪一点也不差。
实测下来,这个SMARC模块在"空载待机+网络保活"这个典型场景下,24小时平均功耗0.88W,夜间低谷能到0.72W,白天高负载运行也不会超过4.2W。拿这个数据去跟客户谈电池续航预算,说服力直接拉满。
5. 打样调试阶段踩过的坑,我把排查链路完整复盘一下
这一章我先把话放前面:跑通参考设计不代表产品能落地,打样调试才是真正折磨人的阶段。下面这几个问题,几乎每个低功耗核心板项目都会遇到,我把我的排查思路完整写出来,给大家一个可复现的参考。
5.1 启动到U-Boot就黑屏,时钟使能顺序问题
第一次拿到打样的板子,上电后串口一点输出都没有。原理图核对了两遍、焊点检查了一遍,电源树各路电压都没问题,就是没反应。最后用逻辑分析仪抓了PMIC的输出时序,发现VDD_SOC的电压上电爬升太慢,从0V到0.85V花了近20ms,而RAM和IO电压早就稳定了——这违反了datasheet里"VDD_SOC必须在NVCC_DRAM稳定前到达"的时序要求。
排查链路是这样的:
- 第一步,用示波器量PMIC的三个主要BUCK输出顺序,确认是否满足上电时序。
- 第二步,如果发现时序不对,检查PMIC配置引脚上的电阻分压网络,PCA9450A的时序是通过引脚电阻的阻值组合来预设的。
- 第三步,确认配置无误但时序仍然不对,就要怀疑PMIC芯片本身或者周边反馈电容的值是否偏大,导致环路响应变慢。
我这次就是第三步踩中了:反馈电容从datasheet建议的22pF换成了100pF,导致软启动时间拉长,VDD_SOC爬坡变慢。换成22pF之后,时序完全正常,U-Boot启动信息顺利输出。
5.2 核心板插入底板上电瞬间复位不可靠
这个坑更隐蔽。板子放工作台上调试一切正常,但一插到金属外壳的底盒里,按下电源键偶尔会起不来,需要按两次甚至三次才正常启动。
排查思路:
- 先排除电源问题——用示波器测5V输入,没有明显跌落。
- 锁定复位信号——用示波器抓POR_B引脚,发现插壳后这个引脚上叠加了一个约200mV、频率约1.8MHz的毛刺,幅度不大但波形明显不干净。
- 查毛刺来源——原来是外壳的接地不良,通过连接器的GND引脚耦合进来,在复位引脚上形成了一个地弹噪声。
解决办法:在POR_B引脚上并联一个100nF的电容到GND,把毛刺滤掉;同时在模块的边沿引脚GND和外壳之间增加导电泡棉,改善接地连续性。这个方案实测后,几百次冷启动全部通过,没有再出现过一次复位失败。
5.3 eMMC写入偶发掉电丢数据,怎样从根本规避
这是我在老化测试中发现的:断电瞬间如果有数据正在写eMMC,重新上电后偶发文件系统损坏。就算加了文件系统日志,也只能保证崩溃一致性,不能保证业务数据不丢。
我的处理方案分三层:
| 层次 | 措施 | 效果 |
|---|---|---|
| 硬件 | 系统侧增加大容量电容(保持时间大于200ms) | 掉电后给紧急flush留时间 |
| 内核 | 配置ext4的auto_da_alloc和barrier=1 | 保证元数据先落盘 |
| 应用 | 关键数据先写临时文件,fsync之后rename | 原子替换,避免覆盖写中断 |
再加上一个电源监测GPIO——用一颗比较器检测5V输入跌落,触发GPIO中断,内核收到中断之后执行最快的同步/卸载流程。这套机制在掉了1000次电的验证中,没有再出现过一次文件系统损坏。
5.4 内存带宽不足导致NPU推理掉帧
还有一个性能相关的坑。在做视频流AI检测时,分辨率从720p提升到1080p,发现NPU推理时间没变,但视频解码出现周期性掉帧。一开始以为是解码器性能瓶颈,排查CPU占用率发现并不高,最后用perf工具分析,发现DDR带宽占用率超过了80%,瓶颈在内存带宽而非算力。
解决方案有两个:一是把视频解码从VPU硬件解码改为GPU式软解码加裁剪缩放,降低DDR带宽压力;二是把NPU的输入张量在DDR中做内存对齐,减少非对齐访问带来的带宽浪费。调整之后1080p下的掉帧问题解决,系统整体DDR带宽占用降到60%左右。
6. 这个低功耗SMARC模块到底能跑什么场景,未来怎么扩展
硬件和软件都顺了之后,最重要的问题来了:这套平台到底能在哪些场景落地?我拿这颗i.MX8M Nano模块做了几个方向的验证,有的已经交付客户,有的还在持续打磨,讲出来给大家做个参考。
6.1 已经跑通的典型应用:边缘AI、HMI设备与电池供电终端
我在这款模块上跑通了三个方向的完整方案。
第一个是边缘AI盒子:接了一个USB摄像头,跑TensorFlow Lite的YOLOv4-tiny模型做人员检测,输入320x320,实测推理速度45ms/帧,整机功耗在2.5W左右。客户拿去做车间安全帽检测,效果不错。这个场景最看重的是NPU算力和低功耗的平衡,Nano刚好卡在这个甜蜜点上。
第二个是工业HMI(人机界面):虽然没有GPU,但用Qt做2D界面和工业组态显示毫无压力,接eDP屏显示1080p内容,跑一个MODBUS转以太网的采集线程,稳定运行一个月没重启过。全金属外壳、无风扇、被动散热,壳体温度稳定在55度左右,非常可靠。
第三个是电池供电的便携监测终端:这个用到前面说到的M7协处理器加Suspend机制,大部分时间深度睡眠,每小时醒来一次采集温湿度并通过NB-IoT模块上传,待机功耗0.08W,两节18650电池串联供电能撑3个月以上。这种场景传统上用MCU做,但有了A53核之后,可以跑完整的Linux网络协议栈,OTA升级、远程调试都方便太多。
6.2 NPU的潜力还没完全释放,后续值得深挖
i.MX8M Nano的NPU算力虽然只有0.75 TOPS,但这个级别的算力在工业场景里能做的事情非常多。我最近在尝试把自研的异常声音检测模型(音频分类)部署到NPU上,输入是1秒的MFCC特征,模型极小,NPU推理耗时只有3ms。加上麦克风阵列采集,整机功耗能控制在1.8W左右。这样一台设备就能同时做音频异常检测和振动异常检测,替代了两个独立的控制器,成本下降一截。
另一个探索方向是多摄像头协同:NPU不支持多路视频同时推理,但可以通过GStreamer先做ROI(感兴趣区域)裁剪,只把关键的局部画面送到NPU做推理,这样能在单路视频流里处理多个ROI,变相提升了检测密度。这个方法在交通流量统计场景里有实用价值。
6.3 产业链视角:为什么说SMARC模块适合做产品原型验证
最后聊点感受性的东西。SMARC模块虽然单价不低,但它有个很实用的属性:可量产的原型验证平台。你不用从零画核心板、调试DDR、调PMIC时序,这些交给模块厂商做,你只需要专注在底板的接口和应用逻辑上。如果市场反馈不好,换块芯片或者换个厂商的模块就能重新试错,而不是重新投板再来一遍6周。
另外从成本角度算一笔账:自己画核心板的NRE(开发成本)算上人力、打样、认证,轻松过10万,还不算失败的风险。买SMARC模块贵一点,但项目能早2-3个月上市,市场窗口期的价值远比那点硬件成本大。
我自己用下来的体会是,SMARC加i.MX8M Nano这套组合,非常适合那种"算力需求中低、接口要求多变、功耗敏感、快速迭代"的嵌入式设备。如果你正在评估类似需求的方案,不妨按我前面提到的思路,先从功耗预算和软件能效做起——硬件决定功耗上限,软件决定功耗下限,两头都抓,才能把低功耗做到真正能用。