最近读到一份关于车规MCU安全架构与自动驾驶决策系统的技术论文拆解,标题里几个关键词我都很熟:RISC-V、TEE、实时控制、神经网络优化。单独拎出来每一个都有人在讲,但把这几件事放在同一个上下文里琢磨,恰恰是车规芯片正在发生的变化。过去做车载控制器,大家默认走ARM Cortex-R加上AUTOSAR那一套,现在RISC-V开始往车规MCU路线图上挤,而TEE这种以前更多出现在手机安全方案里的东西,也开始成为自动驾驶执行侧安全底座的一部分。这篇文章我不打算复述论文,而是把它当引子,结合我做嵌入式控制和车载安全项目这些年踩过的坑,把“车规MCU怎么和自动驾驶决策系统配合”这件事讲清楚。适合正在做车载软件、安全预研、模型部署的工程师看,也适合想搞清楚车规芯片水有多深的产品经理。
1. 为什么车规MCU要谈“安全架构” —— 自动驾驶决策系统的底气从哪来
1.1 感知可以交给SoC,但执行永远绕不开MCU
自动驾驶系统从功能上拆,很多人第一反应是感知、融合、决策、规划、控制这么一条链。感知和决策这类重活,今天几乎都跑在高算力SoC上,比如各家域控制器里的GPU/NPU处理器。但真正落到方向盘转角、制动主缸压力、驱动电机扭矩这些机构动作上时,背后一定站着一颗MCU。
这不是习惯问题,是实时性和确定性的要求。SoC上的Linux系统有虚拟内存、调度器、内存碎片、锁竞争,某个CPU核跑满高负载时,另一个核的中断延迟可能出现不可预测的毛刺。刹车系统承受不起一个“不确定的50毫秒”,但MCU可以。MCU的中断响应时间、任务调度周期、外设采样时隙,都能用指令周期数推导出来,这是功能安全最看重的东西。论文里把“自动驾驶决策系统”和“车规MCU安全架构”放在一个标题下,本质上就是在讨论一件事:智能决策的终点是物理执行,物理执行侧必须有一个确定性极高、安全措施完整的控制器兜底。
1.2 功能安全与网络安全,两条线同时收紧
车规MCU这些年设计语言的改变,很大程度上是ISO 26262和ISO/SAE 21434这两套标准推着走的。ISO 26262管功能安全,要求把随机硬件失效的概率压到极低,ASIL D是最高等级,对单点故障度量、潜在故障度量都有硬指标。ISO/SAE 21434管网络安全,重点是防止别人通过软件手段篡改、注入、窃取车辆核心数据。
这两条线同时压到一颗MCU身上,催生了一批大家今天已经熟悉的硬件机制:双核锁步(Lockstep)用来做冗余计算比较,SRAM和Flash支持ECC纠错,片内BIST上电自检,硬件安全模块(HSM)存放密钥并加速加解密运算,再加上安全启动、安全调试、看门狗。你会发现,这些机制的名字在每一家芯片厂商的Datasheet里都能找到,但真正想把它们组织成一套完整架构,是需要设计的,不是把零件堆上去就完事。TEE之所以在车规圈越来越热,就是因为它提供了一种软件层面的隔离框架,把“安全机制”真正用起来,而不是让它们停留在硬件寄存器里睡大觉。
1.3 单上SoC不行,但MCU也不是孤军奋战
有人问过一个问题:既然SoC算力这么强,为什么不能把所有事情都丢给它,再给它套一个实时操作系统?实际操作层面会遇到两个麻烦。一是Linux这种通用操作系统在取证性上很难满足ASIL D的随机失效指标,二是一旦SoC本身出问题,必须有另一个独立单元可以把它拉回安全状态。MCU的地方在于既能和SoC通过高速接口通信,又具备独立工作能力。即使SoC上的感知芯片完全“脑死亡”了,MCU仍然能维持基本的转向助力、制动冗余、车辆下电,保证整车从高速状态降级到安全停车。
这就形成了一种行业共识的分工模式:SoC负责高算力感知与决策,MCU负责安全岛与实时执行,两者之间用冗余链路通信。TEE很多时候就部署在MCU侧,负责把SoC发过来的决策指令做可信校验,再转发给底盘执行器。也就是说,论文讲的“安全架构”并不单指某一颗芯片,而是一套跨越SoC和MCU的信任与责任边界设计。
2. RISC-V进入车规MCU:不是要抢谁的饭碗,而是重新定义信任边界
2.1 开放指令集给车规带来了什么
RISC-V在车规市场升温,最初被讨论最多的理由是授权成本和IP灵活性。ARM的IP授权费用高,而且核心微架构你改不动;RISC-V指令集开源,芯片公司可以拿到指令级控制权,想塞自定义指令就塞。这在传统MCU领域是件很难想象的事情。
但对车规来说,还有一点比“省钱”更重要:可审计性。功能安全认证本身要求对硬件实现有足够深入的理解,RISC-V的源代码级透明让安全认证流程更容易推进。另一个实际好处是扩展指令可以围绕控制环路量身定制。比如电机控制里常用的三角运算、PI控制器累积、矢量变换,可以把这些算子做成一条自定义指令,省掉几十条常规指令的周期。现在公开资料能看到的车规RISC-V方案,普遍带有锁步核、ECC、BIST、真随机数发生器这类基础安全模块,说明厂商不是拿一个低端开源核改个名字就来交付的。
不过我得泼一盆冷水:RISC-V在车规领域的生态成熟度还远没到ARM那个程度。编译器优化、调试工具、AUTOSAR适配、功能安全认证包、长期供货承诺,这些都是芯片厂和工具链伙伴要一起积累的。它真正的优势窗口在“新兴需求”上,比如自动驾驶控制器里需要大量自定义安全策略的MCU,这种场景下RISC-V的开放灵活性是ARM很难追的。
2.2 TEE到底是什么:一个带金库的银行柜台
讲TEE之前,我想用一个生活化类比。银行营业厅有两块区域:普通柜台和后面的金库。普通柜台每个人都进得来,办存取款、转账;金库只有少数工作人员能进,里面放着现金、保险柜、密钥。让一个普通用户直接跑进金库,出事的概率极大。TEE就是这套“物理隔离+权限分级”思路在芯片上的实现。
在传统MCU软件架构里,所有程序通常运行在同一个特权级或同一个内存空间。一旦某个网络服务被攻破,攻击者就能顺着漏洞读遍整个芯片的内存。TEE的做法是划分成普通世界(Normal World)和安全世界(Secure World),普通世界跑RTOS、应用逻辑,安全世界跑安全关键代码和密钥管理。两个世界通过硬件机制隔离,普通世界即使被完全攻破,也碰不到安全世界里的数据。
最近圈子里常说的“tee沙盒”,本质是在TEE内部再做一层更细粒度的隔离容器。你可以把它理解成金库里再建一排带独立锁的保险柜。车规场景下这个能力很有用:自动驾驶模型的权重是核心IP,OTA升级证书、诊断密钥是敏感资产,第三方合作伙伴的算法包也需要闭源交付。TEE沙盒就能把这些东西分别锁进不同的保险柜,谁要访问,走申请、授权、审计流程。对做安全设计的人来说,TEE不再只是启动时验个签,而是一个可以在运行期持续保护敏感数据的运行环境。
2.3 落地形态:RISC-V上的物理隔离与HSM
在ARM上,TEE最常见的形态是TrustZone,它把CPU分成安全态和普通态,配合总线层面对内存区域的访问控制。RISC-V没有照搬这套机制,而是用了自己的一套组合拳。
第一层是PMP(Physical Memory Protection),也就是物理内存保护。它不像ARM的MMU那样做虚拟地址翻译,而是直接按物理地址段配置访问权限。PMP的好处是逻辑简单、硬件开销小、实时性好,特别适合MCU场景。配置PMP后,普通世界的代码只能读写被允许的物理内存区,想要访问安全世界的内存区域,硬件直接拦下来。
第二层是Secure Monitor。通常会有一个运行在最高特权级(Machine Mode)的监控程序,负责普通世界和安全世界的切换,类似一个门卫。安全世界跑什么、普通世界跑什么,都由这个门卫来调度和校验。
第三层是HSM硬件安全模块。HSM往往有独立的内核和存储空间,专门执行AES/SHA/HMAC/SM系列的加解密算法,密钥放在专用存储里,不经过CPU主内存。就算攻击者拿到了总线上的一部分数据,没有HSM内部密钥,也无法解密真正的固件或通信内容。
我见过不少团队讨论RISC-V TEE,上来就期待它能像ARM TrustZone那样有一套开箱即用的成熟SDK,这是个误区。RISC-V的TEE方案到今天仍然处在快速演进阶段,芯片厂商普遍会提供自己的安全固件和驱动库,但跨平台生态远没有统一。落地之前一定要先问清楚:这颗芯片的安全世界里能不能跑我的关键实时任务?TEE切换一次到底要花多少周期?别拿论文里的理想数字当实测结果。
2.4 安全启动的信任链:从芯片通电那一刻开始
安全架构不能只靠运行期的隔离,启动过程必须从一个可信的源头开始,否则攻击者可以在TEE加载之前就篡改固件。完整的信任链大概是这样的:
- 芯片上电,BootROM执行第一段代码,这段代码固化在芯片内部,不可改写。
- BootROM根据熔丝或OTP中预置的根密钥,验证第一级引导程序的签名。
- 第一级引导程序验签通过后,再验证TEE镜像和RTOS镜像。
- RTOS启动后再验证各个应用模块的签名和哈希。
每一级验证都建立在前一级可信的基础上,就像链式担保。验签失败的处理也很有讲究,绝不能当作没看见继续往下跑,一般会直接进入安全状态:要么锁死不做任何动作,要么只启动一个最小化的“安全模式”,让车辆可以维持基本功能并提示驾驶员。
这里有个工程上常见的坑:很多团队把安全启动做成“启动时验一次签”,后面就不再保护了。如果系统运行期攻击者把内存里的数据改了,启动时验签根本管不到。所以安全启动要和运行期的内存完整性检查、TEE隔离配合起来,才算完整闭环。
| 车规安全需求 | 对应机制 | 作用层次 |
|---|---|---|
| 防止固件被篡改 | 安全启动签名验证 | 启动阶段 |
| 防止运行期代码注入 | TEE内存隔离、PMP访问控制 | 运行阶段 |
| 防止通信伪造 | SecOC认证、HSM密钥管理 | 通信阶段 |
| 防止敏感数据泄露 | TEE沙盒、加密存储 | 数据阶段 |
| 防止随机硬件失效 | 锁步核、ECC、BIST | 硬件阶段 |
3. 实时控制与神经网络优化:把看不见的延迟切出硬预算
3.1 实时系统的本质是预算管理,不是单纯比拼速度
做实时控制的人有个共识:平均延迟低不叫实时,抖动小、最坏情况可控才叫实时。一辆车以120公里/小时行驶,每秒前进33.3米;控制决策晚20毫秒,车就已经滑出去0.66米。所以实时系统设计的第一件事,是给每个任务切预算。
常见的控制周期可以作为一个参考基准:电机电流环通常是10kHz到20kHz,转速环1kHz到2kHz,底盘稳定性控制500Hz到1kHz,自动驾驶决策层的周期性任务一般是100Hz到500Hz,而独立的安全监控任务往往比主任务快一个量级,比如用1kHz的频率去监控一个100Hz的控制循环。周期越快的任务,留给神经网络推理的时间越短,这直接决定了模型压缩到什么程度才算合格。
论文和实际产品的最大区别就在于,论文可以只报告模型精度和平均推理时间,但量产车必须回答“最坏情况下这个推理能不能在5毫秒内完成”。我见过不止一次这样的案例:实验室里模型跑得飞快,一挂到被其他任务占满的CPU上就超时,最后不是优化模型,而是砍功能。所以从一开始就要把计算预算当成一等公民来对待。
3.2 神经网络塞进MCU的第一道坎:参数压缩与量化
自动驾驶决策系统里的神经网络如果跑在高算力SoC上,可以用FP32甚至更高精度。但一旦需要跑在MCU侧或轻量级NPU上,第一件事就是量化。
量化的核心思路很简单:把32位浮点参数映射到8位整数,计算开销大幅下降,内存占用减到四分之一。以INT8量化为例,关键参数是scale和zero_point。举个例子,假设某一层激活值的统计范围是[-6.0, 8.0],量化步长就是(8.0-(-6.0))/255=0.0549,零点偏移为round(-(-6.0)/0.0549)=109,也就是说浮点0对应整数109。推理的时候,每个浮点输入先除以步长再加零点偏移,最后做取整和裁剪,保证结果在[0,255]区间内。
实际操作中有两种路线:PTQ(训练后量化)和QAT(量化感知训练)。PTQ成本低,拿训练好的模型,用一小批校准数据统计范围就能做,适合快速验证;QAT则在训练过程中就把量化的精度损失模拟进去,最终精度通常更高,但需要重新训练模型。MCU侧部署时,我倾向于至少用QAT做关键层的再训练,省得量产后精度崩塌。
模型压缩的另一条路是剪枝和蒸馏。剪枝是去掉那些权重接近零的通道,蒸馏是让大网络当老师、小网络当学生,用知识迁移的方式把小网络训练到尽量接近大网络的精度。以部署在车端的轻量分类网络为例,一套完整的优化流程通常是:
- 先用一个表达能力强的网络作为Teacher模型,蒸馏出一个几MB规模的学生模型。
- 对学生模型做QAT量化,权重和激活全部转成INT8。
- 用大量覆盖晴天、雨天、隧道、逆光的场景数据做精度验证。
这套流程做完,模型才能在满足时延预算的同时达到可接受的准确率。
3.3 算子与硬件协同:NPU不是无脑加速器
不少人对NPU有一个误解,以为只要把模型丢给它就能快。实际上NPU对网络结构的限制比GPU多得多,它通常只支持一系列约定好的算子集合。如果你的网络里有一个NPU不支持的算子,整个任务就可能被打回CPU执行,这一层的延迟直接飙升到不可接受。
所以模型部署时通常要做算子融合和内存布局优化。算子融合是把相邻的卷积、批归一化、激活函数合并成一个算子,减少中间结果搬运。内存布局方面,NPU对特征图的内存排列有偏好,比如NHWC或NCHW,选错排列会引入大量DMA搬运。RISC-V的向量扩展(Vector Extension)对卷积这类运算天然友好,一条向量指令能批量处理多个元素,这也是很多人觉得RISC-V在AI推理上有后发优势的原因之一。
还有一个经验:NPU的吞吐量高不代表单次推理延迟低。吞吐量衡量的是单位时间跑多少帧,延迟衡量的是单帧从输入到输出的时间。MCU侧更关心的是单次推理延迟,因为控制循环是周期性的,延迟直接挤占任务预算。选型时一定要实测“最坏情况下的单次推理延迟”,别只看TOPS算力。
3.4 决策系统里的“AI+规则”双保险
自动驾驶决策系统几乎不会把神经网络作为唯一决策源,行业共识是采用混合架构。主决策用神经网络输出候选动作和置信度,规则引擎按功能安全策略做兜底校验。比如神经网路给出一个向左变道的动作,规则引擎会检查当前车道线状态、后方来车距离、转向执行机构状态,都满足条件才放行。
这很像飞行员和自动驾驶仪的关系:神经网路是自动驾驶仪,规则引擎是飞行员监控。两者有个仲裁机制,当输出不一致且置信度低于阈值时,系统应该自动降级,而不是继续执行有风险的指令。
从安全架构角度看,主模型和安全监控模型最好放在不同的隔离域里。主模型跑在普通世界的AI加速单元上,安全监控模型放在受TEE保护的可信环境中。这样做的好处是即使主模型被攻击或发生计算异常,独立的安全监控链路还能给执行器一个可靠的退出路径。
3.5 调度与TEE协同:隔离切换是要花钱的
引入TEE之后,调度设计多了一个新维度:任务放在普通世界还是安全世界。原则上,涉及密钥、证书、篡改防护的任务进入安全世界;对实时性要求极高、安全等级又高的控制任务,需要仔细权衡。
TEE每次世界切换都要经过Secure Monitor,这会带来几十微秒量级的开销。如果控制循环只有5毫秒周期,切换开销占到1%到2%,还能接受;但如果任务频繁在普通世界和安全世界之间来回切换,累积开销就非常可观了。我见过一个团队把所有密钥操作都做成同步调用,结果安全服务本身把主循环压垮。
解决思路是批量提交和异步化。把加密、验签、证书解析这些操作打包成一批,一次性切到安全世界处理,而不是每来一条CAN报文就切换一次。还有一个更极端的做法:把最关键的实时控制任务放进安全世界常驻,普通世界只负责通信和日志。这样让最危险的控制路径免于切换开销,但代价是安全世界需要承担更多实时调度责任,对固件设计要求更高。我的建议是,在架构阶段就为TEE切换预留至少15%的CPU余量,别把性能压到极限再去填坑。
// TEE安全服务调用伪代码示意 // 关键原则:批量提交,减少世界切换次数 int tee_batch_request(struct tee_cmd *cmds, int nr_cmds) { int i; for (i = 0; i < nr_cmds; i++) { // 将多个命令打包到一个共享内存队列 shm_queue_push(&secure_queue, &cmds[i]); } secure_monitor_call(SMC_BATCH_PROCESS); return shm_queue_drain(&secure_queue, cmds, nr_cmds); }4. 论文与产业落地的差距:拆一份新技术架构时的实操心法
4.1 读这类论文先看三个视角
一篇车规MCU安全架构与自动驾驶决策系统方向的论文,就算技术再前沿,也通常会围绕架构图展开。我看这类论文,第一件事不是读正文,而是先找完整架构图,重点观察三个点:
一是安全分区是怎么画的。哪些模块被划入可信域,哪些在不可信域,分区之间靠什么通信。如果论文只给了概念图,没给出PMP或等价硬件的具体配置,就要警惕了。
二是异常处理路径。真正有价值的论文不会只讲“安全启动验签成功”的美满结局,一定会讨论某一步验签失败之后,系统怎么切换、怎么降级、怎么复位。这才是工程上最见功力的地方。
三是评估方法。论文有没有给出最坏情况时延、有没有分析任务超时的概率、有没有把ASIL等级和具体硬件机制对应起来。如果通篇只有神经网络精度和算力TOPS,那基本属于学术PPT,离落地还差得远。
4.2 容易被论文掩盖的工程问题
论文解决的是“能不能”,工程解决的是“能不能稳定量产”。我这些年评审过不少基于论文思路做的方案,有些坑几乎每次都会遇到。
第一个坑是供应链成熟度。RISC-V MCU供应商能不能承诺15年的汽车行业供货周期,能不能提供完整的安全手册和FMEDA文档,量产桶位是否稳定,这些在论文里统统看不出来,但挑错供应商直接决定项目生死。
第二个坑是密钥与证书的生命周期管理。安全启动和TEE再多设计,如果密钥在产线上就被泄露或者预置错误,整个安全体系等于纸糊的。产线密文注入、密钥槽位分配、开发密钥与量产密钥严格分离,这些不起眼的细节恰恰决定了量产能不能顺。
第三个坑是OTA升级模型变更之后的再认证。改一个神经网络模型,不只是换一个文件那么简单。新模型的推理延迟、内存占用、安全监控阈值、功能安全评估,全都要重新过一遍。有些公司模型上线后发现决策逻辑和法规文档对不上,又回炉重做。
4.3 常见坑与排查速查表
| 现象 | 可能原因 | 排查手段 | 建议 |
|---|---|---|---|
| 安全启动总失败 | 预置密钥不匹配、熔丝位配置错误 | 查看BootROM错误码,核对证书链 | 开发阶段和量产阶段密钥隔离,使用产线注入工具 |
| CAN报文被SecOC丢弃 | 防重放计数器漂移、密钥版本不匹配 | 用CAN工具抓报文,对比收发双方计数器 | 上线前统一密钥版本,定期同步计数器基准 |
| 决策任务偶发超时 | TEE切换过于频繁、中断优先级不当 | 统计安全服务调用次数和耗时 | 批量提交命令,中断处理尽量简化为置位标记 |
| 量化模型精度掉点 | 零点偏移计算错误、校准集覆盖不足 | 逐层对比浮点和INT8输出 | 增加场景多样性,关键层改用QAT训练 |
| 看门狗误复位 | 主循环被长任务阻塞,喂狗不及时 | 抓取任务级时间戳,定位最长阻塞段 | 把耗时操作拆成状态机分片执行 |
4.4 从论文到量产的一条可行路线
如果团队想基于一篇论文做技术预研,我建议分三步走。第一步是架构可行性验证,用开发板或模拟器先把TEE和安全启动跑起来,确认切换开销、内存开销和工具链支持度。第二步是做一个小而全的闭环Demo,比如把汽车尾部防撞策略做成一个模型,在MCU侧跑完感知到控制的完整链路,量化时延、功耗、代码量。第三步才是正式选型,让芯片厂商提供功能安全与网络安全认证材料,用两个月时间做一个软硬件联合压力测试,再决定是否进入量产项目。
整个过程里,安全团队要尽早介入,不要等架构冻结了才提意见。我在车上做过不少“事后补安全”的项目,成本通常是早期介入的五到十倍。安全架构这东西,前置思考的值钱程度,只有交过学费的人才懂。
关于车规MCU和AI系统的结合,我个人的体感是:这两年方向已经非常明确,RISC-V和TEE的组合会成为自动驾驶执行侧的重要底座,但真正决定成败的往往不是最前沿的算法,而是一些不起眼的预算管理、密钥管理和最坏情况分析。最后再分享一个实用的技巧:给TEE服务调用加一个性能计数器,把每次切换耗时、调用次数、排队时间都记录下来,上线初期保留一段时间日志,你会发现很多“偶发超时”问题根本不用猜,看一眼计数器就能定位。这个习惯,帮我省过好几个通宵。