从0做到量产,然后被裁,这八个字放在一起,做过硬件的人看了大概率会沉默几秒。我是在一个周五下午收到通知的,项目刚过完量产评审,产线良率爬到了96%以上,我负责的板子从原理图第一版到最终量产文件,前后改了七版。HR约我谈话的时候,我手里还拿着刚打印出来的EMC整改报告。这篇文章不打算贩卖焦虑,也不打算写什么行业观察,我只想把这三年从零到量产的全过程拆开,把那些真正踩过的坑、那些没人会写在教科书里的经验、以及最后被裁时我复盘出来的问题,一条一条讲清楚。如果你是刚入行的嵌入式硬件工程师,或者正在经历从样机到量产的痛苦阶段,这篇内容应该能帮你少走至少半年的弯路。
1. 从零到样机:那些看起来最不起眼却最致命的选型决策
1.1 主控选型不是选性能最强的,而是选你最熟悉的
我刚进这家公司的时候,项目还处于概念阶段。产品是一个带无线通信功能的工业数据采集终端,需求文档写得比较粗,核心指标就几条:支持4G Cat.1通信、本地存储不少于8GB、工作温度-40到85摄氏度、整机功耗在待机状态下低于2瓦。老板给的时间是四个月出样机,六个月小批量,一年内量产。
我拿到的第一个任务是选主控。当时市面上主流的方案有几类:STM32MP1系列、NXP的i.MX6ULL、全志的R系列,还有瑞芯微的RV1109。我一开始倾向于选i.MX6ULL,因为资料多、社区活跃、之前在学校做过类似的项目。但团队里另一个老工程师建议用STM32MP157,理由是双核架构,A7跑Linux,M4跑实时任务,一颗芯片搞定所有事。
我当时的判断是:双核架构听起来很美,但实际调试复杂度会成倍增加。A7和M4之间的通信机制、资源分配、启动流程,每一个环节都可能成为项目延期的理由。而且STM32MP157的BGA封装对PCB层数要求更高,至少需要六层板,成本直接上去了。最终我们选了i.MX6ULL,单核A7,主频528MHz,DDR3内存512MB,NAND Flash 256MB。这个配置放在2024年确实不算先进,但对于我们的应用场景来说完全够用。
这里我想说的是,选型的时候不要被“性能过剩”带偏。很多刚入行的工程师会觉得主频越高越好、核心越多越好,但实际项目中,你真正需要的是:稳定的供货周期、成熟的BSP支持、你团队能hold住的调试难度。i.MX6ULL的BSP是NXP官方维护的,Yocto工程直接能用,内核版本从4.1到5.15都有支持,这一点在后期量产时救了我们很多次。
1.2 电源树设计:别等到EMC测试不过再回头改
电源部分是我踩的第一个大坑。样机阶段我们用的是分立DC-DC加LDO的方案,输入12V,经过两级降压得到5V、3.3V、1.8V和1.2V。原理图看起来没问题,样机也能跑起来,但到了EMC预测试的时候,辐射骚扰在30MHz到100MHz频段超标了将近6dB。
排查过程很痛苦。我们先用近场探头定位,发现噪声主要来自第一级DC-DC的开关节点。换了屏蔽电感、加了RC吸收电路、调整了开关频率,折腾了两周才勉强压下去。但代价是效率从92%降到了87%,发热量明显增加。
后来复盘的时候,一个做电源出身的朋友跟我说了一句话:电源树的设计应该在原理图阶段就考虑EMC,而不是等测试不过再补救。具体来说,DC-DC的输入输出电容要尽量靠近芯片引脚,开关回路的面积要尽可能小,电感要选屏蔽式的,反馈走线要远离开关节点。这些听起来都是基础知识,但在实际画板的时候,布局工程师往往优先考虑信号走线,电源部分被压缩在角落里,问题就出来了。
我们最终的解决方案是换了一颗集成度更高的PMIC,把多路电源集成在一颗芯片里,开关频率统一到2MHz,外围元件数量减少了三分之一,EMC问题自然缓解了很多。这颗PMIC的单片价格比原来分立方案贵了将近两块钱,但考虑到EMC整改的人力成本和时间成本,这笔账是划算的。
1.3 接口防护:量产阶段最容易出批量事故的地方
样机阶段我们只做了三台,接口防护基本没怎么考虑。RS485接口直接用了TVS管,USB接口加了ESD保护,看起来该有的都有了。但到了小批量试产的时候,第一批50台机器发到现场,不到一个月就有7台返修,问题全部出在RS485接口上。
拆开分析后发现,TVS管的钳位电压选高了。我们用的是SMBJ6.5CA,钳位电压在10.5V左右,而RS485收发器的绝对最大耐压是-8V到+13V。理论上没问题,但实际现场环境中,雷击浪涌和静电放电的能量远超标称值,TVS管响应速度不够快,收发器芯片直接被击穿。
后来我们换成了响应速度更快的ESD保护器件,同时在RS485的A/B线上串联了10欧姆的电阻,配合共模电感使用。这个方案增加了不到一块钱的成本,但返修率直接降到了零。这件事让我明白一个道理:接口防护不是“有就行”,而是要针对实际使用环境做针对性设计。工业现场的电磁环境比实验室恶劣得多,样机阶段测不出来的问题,量产阶段一定会暴露。
2. 从样机到小批量:那些让你半夜爬起来改代码的驱动问题
2.1 NAND Flash的坏块管理:别等到量产才发现数据丢失
我们的产品需要本地存储数据,选的是256MB的SLC NAND Flash。样机阶段读写都正常,但到了小批量的时候,有几台机器出现了数据丢失的情况。排查后发现是坏块管理的问题。
NAND Flash出厂时就有坏块,使用过程中也会产生新的坏块。Linux内核的MTD子系统有坏块管理机制,但需要正确配置。我们当时用的是UBI文件系统,理论上支持坏块管理和磨损均衡,但参数配置有问题。UBI的预留块比例设置得太低,只有2%,而实际使用中坏块率可能达到3%到5%。当坏块数量超过预留块时,UBI就会报错,导致数据写入失败。
调整参数后问题解决了,但这件事给我提了个醒:存储方案的设计不能只看容量,还要考虑寿命和可靠性。我们后来把预留块比例调到了8%,同时增加了数据校验和重传机制。虽然可用容量减少了,但数据可靠性有了保障。对于工业设备来说,数据丢失的代价远大于存储成本。
2.2 看门狗喂狗策略:不是所有超时都是坏事
看门狗是我们调试过程中最纠结的一个模块。硬件看门狗用的是芯片内置的WDT,超时时间设置为10秒。应用层有一个线程专门负责喂狗,正常情况下每2秒喂一次。但问题在于,有些任务执行时间会超过10秒,比如固件升级、大数据量存储、网络重连等。如果这些任务执行期间看门狗超时,系统就会复位。
我们试过几种方案。第一种是把看门狗超时时间延长到30秒,但这样失去了看门狗的意义,系统死机后要30秒才能复位。第二种是在长任务执行前先喂狗,然后关闭看门狗,任务完成后再打开。这个方案的问题是,如果任务执行过程中系统真的死机了,看门狗被关闭,系统就永远不会复位。
最终我们采用的方案是分层看门狗。硬件看门狗超时时间设为30秒,应用层有一个监控线程,每5秒检查一次各个任务的状态。如果某个任务超过预期时间没有更新状态,监控线程会主动触发系统复位。这样既保证了长任务能正常执行,又能在系统异常时及时复位。这个方案需要应用层和驱动层配合,实现起来稍微复杂一些,但可靠性最高。
2.3 文件系统掉电保护:一次意外断电导致的批量返修
小批量试产阶段,我们遇到了一个非常棘手的问题。现场有几台机器在意外断电后无法启动,返修拆机后发现文件系统损坏,UBI卷无法挂载。这个问题出现了三次,每次都是断电后发生的。
分析后发现,我们的文件系统在写入数据时没有做掉电保护。Linux的UBI文件系统虽然有日志机制,但在写入过程中断电,仍然可能导致元数据损坏。解决方案是启用UBIFS的同步写入模式,同时在应用层增加数据缓存机制,减少频繁的小数据写入。
具体来说,我们把数据先写入内存缓冲区,积累到一定量后再批量写入Flash。同时在每次写入完成后调用sync函数,确保数据真正落盘。这个方案增加了内存开销,但掉电损坏的概率大幅降低。后来我们又增加了超级电容,在检测到断电后提供足够的电力完成最后一次写入操作。这个设计增加了成本,但对于工业设备来说,数据完整性是底线。
3. 从量产到被裁:那些和技术无关却决定命运的事
3.1 量产评审通过的那一刻,其实危机已经埋下了
项目量产评审通过的那天,团队一起吃了顿饭,大家都挺高兴的。良率96%,产能爬坡顺利,客户反馈也不错。但我现在回头看,危机其实在那时候就已经埋下了。
第一个问题是成本。我们的BOM成本比竞品高了将近15%,主要贵在主控和电源方案上。当时选型的时候优先考虑了稳定性和开发效率,没有充分考虑成本控制。量产阶段采购部门反复施压,要求降本,但硬件方案已经定型,改动的代价很大。最后只能通过更换部分物料来压缩成本,但效果有限。
第二个问题是团队规模。项目从零到量产,团队从最初的3个人扩展到了12个人,包括硬件、嵌入式软件、测试、结构等。量产之后,维护工作量大幅减少,团队显得冗余。公司层面的逻辑很简单:项目进入维护期,不需要这么多人。
第三个问题是技术栈的单一性。我们整个项目基于i.MX6ULL和Linux,技术栈相对封闭。团队成员在项目期间积累的经验,很大程度上局限于这个平台。当公司决定转向新的平台时,原有团队的价值就大打折扣。
3.2 被裁那天我才明白:硬件工程师的护城河不是画板子
被裁的消息来得很突然,但事后想想,其实有很多征兆。公司从半年前开始调整方向,新项目全部转向了国产主控平台,而我们这些做i.MX6ULL的老员工,在新项目里能发挥的作用有限。新平台的BSP、驱动、工具链都需要重新学习,公司更倾向于招新人或者内部转岗。
我在复盘的时候问自己一个问题:如果重新来一次,我会怎么做?答案不是“把技术做得更深”,而是“把技术栈拓宽”。具体来说,不要把自己绑定在某一颗主控或者某一个平台上。嵌入式Linux的底层逻辑是相通的,设备树、驱动模型、内核子系统,这些知识在哪个平台上都能用。但如果你只会用NXP的Yocto工程,换到全志或者瑞芯微的平台,可能连编译环境都搭不起来。
另一个问题是,硬件工程师不能只懂硬件。我后来发现,那些在裁员中留下来的人,要么是软硬兼通的,要么是能带团队的,要么是能直接对接客户的。纯粹画板子、调电路的工程师,在项目进入维护期后,价值确实会下降。这不是说硬件不重要,而是说硬件的价值需要在更大的上下文里体现。
3.3 劳动仲裁这件事:该争取的权益不要放弃
被裁之后,公司给的赔偿方案是N+1,但计算基数只算了基本工资,没有算绩效和奖金。我咨询了做劳动仲裁的朋友,他说这个计算方式是不合规的。根据相关规定,经济补偿的月工资基数应该是劳动者在劳动合同解除前十二个月的平均工资,包括计时工资、计件工资、奖金、津贴和补贴等货币性收入。
我最终走了仲裁流程,过程比想象中简单。提交材料、开庭、调解,前后大概两个月,最终拿到了应得的赔偿。我想说的是,很多工程师在被裁的时候会觉得“算了,不想折腾”,但该争取的权益还是要争取。这不是钱的问题,而是对自己劳动价值的尊重。
4. 给还在路上的嵌入式硬件工程师:几条用教训换来的建议
4.1 技术层面:建立自己的“最小可复用单元”
我在项目期间最大的收获,不是学会了某一颗芯片的用法,而是建立了一套自己的“最小可复用单元”。具体来说,就是把常用的电路模块标准化,比如电源树、RS485接口、以太网接口、USB接口、调试接口等。每个模块都有经过验证的原理图和PCB布局,新项目直接复用,只需要根据具体需求调整参数。
这套方法的好处是显而易见的。首先,减少了重复劳动,新项目启动速度大幅提升。其次,经过多个项目验证的模块,可靠性有保障。最后,模块化的设计让排查问题变得更容易,出了问题可以快速定位到具体模块。
我建议每个硬件工程师都建立自己的模块库,不用很复杂,哪怕只是几个常用的接口电路,积累下来就是一笔财富。这些模块不仅包括原理图,还包括布局要点、注意事项、常见问题。比如RS485接口,我会记录TVS管的选型依据、共模电感的参数、终端电阻的配置方式、以及在不同波特率下的注意事项。
4.2 流程层面:把每一次改版的原因记录下来
我们项目从原理图第一版到量产文件,一共改了七版。每一版改动的原因、影响范围、验证结果,我都记录在一个Excel表格里。这个习惯在后期帮了大忙。比如有一次客户反馈某个功能异常,我翻看记录发现这个问题在第三版的时候出现过,当时的解决方案是调整了某个电阻的值。直接复用当时的方案,问题很快就解决了。
记录改版原因还有一个好处,就是方便交接。项目后期有新同事加入,我直接把表格发给他,他就能快速了解整个项目的演进过程。这比口头讲解或者看原理图要高效得多。
我建议记录的内容包括:改版编号、改版日期、改动内容、改动原因、影响范围、验证结果、负责人。不用很复杂,但要坚持记录。时间长了,你会发现这是一笔非常宝贵的财富。
4.3 职业层面:不要把鸡蛋放在一个篮子里
这句话听起来像废话,但真正做起来并不容易。我在这个项目上投入了三年时间,技术栈、人脉、甚至日常作息都和这个项目绑定在一起。当项目结束、团队解散的时候,我才发现自己需要重新建立很多东西。
我的建议是,在做好本职工作的同时,保持对行业动态的关注。不是说要随时准备跳槽,而是要了解外面的世界在发生什么。比如国产主控的崛起、RISC-V的进展、边缘计算的需求变化,这些趋势可能会影响你未来的职业选择。
另外,不要排斥软硬结合。嵌入式硬件工程师如果懂一些应用层开发、懂一些系统调试,职业选择会宽很多。我在被裁之后面试了几家公司,发现那些要求“软硬兼通”的岗位,薪资普遍比纯硬件岗位高20%到30%。这不是说硬件不值钱,而是说复合型人才更稀缺。
4.4 心态层面:被裁不是你的错,但复盘是你的责任
被裁这件事,客观来说和我的技术能力关系不大,更多是公司战略调整的结果。但我在复盘的时候,还是找到了很多自己可以做得更好的地方。比如成本控制意识不够强、技术栈过于单一、对行业趋势不够敏感。这些问题不会因为换一家公司就自动消失,如果不主动改变,下一次可能还会遇到类似的情况。
我想说的是,被裁不是世界末日,但也不能完全归咎于外部环境。把能控制的事情做好,把不能控制的事情看淡,这可能是每个职场人都需要修炼的心态。对于嵌入式硬件工程师来说,技术更新速度快、项目周期长、量产压力大,这些特点决定了我们需要不断学习、不断调整。保持学习的能力,比掌握某一项具体技术更重要。
最后分享一个我在仲裁期间学到的小知识:劳动合同、工资流水、考勤记录、工作邮件,这些材料平时就要有意识地保存。不是为了打官司,而是为了在需要的时候能证明自己的价值。我当时因为平时有保存工作邮件的习惯,仲裁时提交的证据非常充分,整个过程顺利很多。这个习惯,建议你也养成。