ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自动驾驶中的英飞凌AURIX MCU:多核架构、锁步核与功能安全实战

自动驾驶中的英飞凌AURIX MCU:多核架构、锁步核与功能安全实战 英飞凌MCU进入奥迪自动驾驶功能这件事放在圈外人眼里可能只是个供应链新闻但做过车控开发的人应该明白这背后其实藏着一整套关于功能安全、多核架构和实时性的工程逻辑。我在做域控制器相关项目时被问得最多的一个问题就是为什么自动驾驶里已经有那么强的SoC比如英伟达Orin、Mobileye EyeQ还要单独配一颗MCU这个答案英飞凌和奥迪的合作恰好能给出来。今天这篇就直接从MCU视角把这件事拆开讲讲包括AURIX系列在系统里到底干什么活、多核和锁步核怎么配、MCAL里有哪些坑以及真正跑功能安全流程时需要注意什么。无论你是刚入行的嵌入式工程师还是正在做自动驾驶域控制器选型这里面的思路应该都能直接用上。1. 为什么英飞凌MCU会出现在奥迪的自动驾驶系统里1.1 自动驾驶MCU的硬性门槛很多人以为“自动驾驶算力越强越好”但实际系统里算力最强的那颗芯片往往只是负责感知和规划真正去控制刹车、转向、油门这些执行器时需要的是另外一类芯片。这类芯片不需要跑神经网络也不需要处理上亿像素的图像流但它必须满足三个硬性条件高实时性、高可靠性、高功能安全等级。这三条恰恰是英飞凌AURIX系列MCU的核心标签。拿实时性来说自动紧急制动场景里从传感器检测到前方障碍物到制动系统真正建压整车层面要求的时间窗口通常是几百毫秒而MCU承担的控制闭环周期往往是1ms到10ms级别。这意味着一颗用来做车辆控制的MCU它的中断响应时间必须稳定可预测不能像SoC那样偶尔被Linux调度抖动影响一下。AURIX这类单片机走的是裸机或者AUTOSAR调度任务执行时间是确定的这正是车控场景最需要的。可靠性方面也不光是“不宕机”那么简单。汽车的电磁环境非常恶劣电机、点火线圈、大功率车灯都会产生各种干扰MCU必须有足够强的抗EMC能力。英飞凌做汽车级芯片做了几十年内部ESD保护、时钟监控、电压监控这些设计都已经沉淀成标准模块。再往上就是功能安全这是整个问题的核心。1.2 AURIX多核架构与传统MCU的思路差异早期汽车MCU基本都是单核比如英飞凌以前的AUDO系列一颗核既要跑控制逻辑又要跑诊断、通信栈忙不过来的时候会通过增加主频硬扛。但自动驾驶对算力的需求不是线性增长而是多元化的既要跑多路CAN通信又要跑车辆动力学模型还要实时监控自身故障。单核时代“主频再高一点”的思路到头了。AURIX系列从TC2xx开始走的是TriCore多核路线一个芯片上集成多颗TriCore内核每个内核都有自己的内存保护、中断控制能力。在TC3xx上旗舰型号TC39x做到了6个TriCore 1.6.2P核心主频最高300MHz以上跑完整个ASIL-D的车辆控制任务绰绰有余。多核的好处不难理解每个核可以专注自己负责的域——核0跑通信和诊断、核1跑车辆动力学控制、核2跑执行器管理互不干扰。真正值得说的是“锁步核”Lockstep Core这个概念。AURIX里通常会把两个相同的核配对成一个锁步核组两个核喂同样的输入、跑同样的逻辑通过一个比较模块实时比对输出。如果两个核的结果不一致说明有硬件故障芯片会立即触发安全机制让系统进入安全状态。这种冗余设计不需要额外写软件逻辑但能覆盖大量硬件失效模式是ASIL-D等级的常用做法。用通俗点的话说一颗常规核在干活旁边还有一颗一模一样的核在“看着”它干活一旦发现不对劲立刻报警。1.3 英飞凌选型逻辑性能、安全与供应链的平衡做车厂系统架构设计时选型不会只看芯片参数还要看整体生命周期。汽车零部件的供货周期动辄十年以上芯片厂商必须保证在这段时间里不会停产、不会断供。英飞凌在车规MCU里的市场地位是它最大的背书奥迪这种体量的车厂肯定优先选择产能稳定、有长期供货承诺的供应商。还有一个容易被忽略的点工具链成熟度。AURICS配套的开发环境、AUTOSAR基础软件、调试器支持都在业内沉淀了很久工程师上手成本低。之前有过项目用过相对小众的MCU结果光是搭编译链和调试环境就耗掉几周这在整车开发节奏里是非常痛的事。AURICS最大的优势之一就是Compiler、Trace、调试器、OS、MCAL全部能对得上跟TASKING、HighTec、EB tresos这些主流工具链配合得也稳。2. 从传感器到执行器AURIX在系统里的实际分工2.1 感知端信号预处理与雷达/摄像头数据接入自动驾驶系统里感知通常由高算力的SoC完成比如摄像头图像在SoC里跑完神经网络输出目标列表。但这些盲目的目标列表不会直接接到执行器上需要经过一层“可信度校验”和“语义融合”这个环节可以由MCU来做也可以由SoC上的软件完成。在英飞凌的方案里MCU更多承担的是接入雷达点云信号、轮速信号、惯性导航信号这些确定性数据的任务。比如毫米波雷达现在很多雷达本身就是带目标的CAN或CAN-FD信号输出MCU通过CAN接口把雷达目标信息直接读进来然后做时间戳对齐和有效性检查。摄像头SoC那边输出的目标列表通过以太网传过来MCU需要做的是把不同传感器的数据先做粗配准——不是做复杂的视觉融合而是把同一时刻的有效目标合并成一个统一格式降低SoC端融合的负担。别小看这一步在实车上传感器数据的时间戳如果不对齐融合出来的目标位置会有整整一个控制周期偏差。AURIX在感知侧的另一个职责是“传感器诊断”。雷达的安装偏移、摄像头被泥污遮挡、轮速传感器信号丢失这些情况都需要MCU通过监控逻辑判断并把故障状态发给SoC。如果MCU发现某个传感器数据可信度低于阈值即便SoC还在正常输出系统也会主动降级这是自动驾驶安全策略里非常关键的一环。2.2 决策端多核任务调度与实时性保证到了决策层MCU要开始跑真正和车辆状态相关的逻辑比如车辆横纵向状态估计、当前驾驶模式判断、系统可用性判断。这些逻辑对延迟极度敏感因为它的输出直接决定后续执行器什么时候动作。实际项目中我们会这样划分任务一个核专门跑固定周期任务比如1ms周期的车辆状态更新另一个核跑事件驱动任务比如CAN中断接收、故障复位逻辑第三个核跑慢速诊断任务例如后台自检、数据记录。AURICS的调度器支持优先级抢占配合它对中断响应时间的优化整个系统可以做到非常稳定的时间行为。需要特别提一下AURIS的GTMGeneric Timer Module和CCU6等外设它们可以减轻CPU的定时负担。比如生成PWM信号、捕获轮速脉冲这类工作可以完全交给硬件定时器CPU只负责读最终结果。这种做法能显著降低CPU占用率让主核把时间花在真正需要复杂计算的控制算法上。2.3 执行端刹车、转向的冗余控制真正能体现“自动驾驶”等级差异的还是执行端的控制。L2级辅助驾驶里MCU直接控制EPS电动助力转向和ESP电子稳定程序但一旦升级到L3以上系统就必须考虑到“MCU失效时怎么办”的问题。常见的做法是双MCU冗余。主MCU负责日常控制备份MCU处于热备份状态实时接收同样的输入一旦主MCU通过心跳信号失联备份MCU立刻接管执行器。英飞凌的AURIS多核特性在这里可以灵活部署你可以把同一颗芯片的内核拆成两个独立分区看起来像两颗独立的MCU也可以用两颗AURIS构成真正的异构冗余。奥迪这套系统按照公开信息推测在域控制器层面应该是同时采用了SoCMCU的结构MCU部分承担的就是执行器的最后一块安全兜底。这里还涉及一个PWM/IO输出的安全切换机制。MCU通过PWM给执行器的驱动芯片发指令如果MCU自身崩溃导致PWM冻结执行器需要能识别出“信号不刷新”并进入安全状态。所以我们在设计时会让MCU周期性地给外部看门狗喂狗一旦看门狗没收到喂狗信号就会切断PWM输出执行器自动回位。这种看似简单的机制是整车安全兜底的重要组成。3. 落地开发的关键环节MCAL、AUTOSAR与多核配置3.1 MCAL和EB tresos的配置细节在真实项目里英飞凌MCU很少像单片机开发那样直接操作寄存器而是通过AUTOSAR基础软件栈来跑。AURICS底层对应的是MCALMicrocontroller Abstraction Layer这一层由英飞凌提供驱动通过配置工具生成代码。常用配置工具是EB tresos它把每个外设的驱动模块拆成一个一个配置项比如ADC、PWM、CAN、SPI、中断、时钟、GPT等等。刚上手的人最容易懵的是“时钟树配置”。AURICS内部有多个时钟源PLL、内部振荡器、外部晶振通过不同的分频/倍频关系生成各类总线时钟。配置错了驱动程序表面上能初始化但定时器周期、CAN波特率、通信串口速率全部会跑偏而且这种问题特别难排查因为看起来“每个模块都工作正常但就是联不上”。我习惯的做法是先用EB tresos配置好时钟树导出到一个Excel表格里逐项核对每个外设的输入时钟是多少然后再去配相应外设的分频系数。不要凭感觉填参数。AURICS很多外设对最大输入时钟有限制超过了会导致外设行为异常。另外MCAL里中断优先级配置也要格外小心。AURIS用的是统一的优先级仲裁机制不同模块的中断源共享几个优先级级别。如果你把一个耗时很长的诊断中断配置成比控制PWM中断还高的优先级控制周期就可能被拉长进而影响车辆动态表现。建议把控制相关中断放最高优先级通信中断次之诊断和日志类再往后放并在这个基础上给每个中断设置实际的执行时间预算。3.2 锁步核与性能核的协同配置AURICS开发里锁步核和正常核的使用方式不太一样。锁步核要在初始化阶段被配置成锁步模式两个核共享同一个程序计数器跑同样的代码。如果你在后面又把锁步核当成普通核用等于白白浪费了冗余能力还会引入安全隐患。在项目里我们通常会根据算力和安全要求做功能分配图把需要达到ASIL-D的功能比如制动控制、转向控制放在锁步核上运行把舒适性功能、诊断日志、性能监控这类对实时性要求极高的但不需要最高功能安全的任务放在普通核上。锁步核上跑的代码要尽可能简洁因为它本身是两个核在同时执行程序逻辑越复杂发生瞬态故障触发锁步比较的概率也会变高频繁复位会影响系统可用性。需要注意一点锁步核的复位与普通核的复位不完全一样。锁步报警触发的复位路径优先级高于普通软件复位而且它可能不会经过完整的初始化流程直接跳到安全状态处理。这里要求工程师在代码里对“安全状态入口”考虑得很清楚——不能只是单纯地报个错然后死循环要确实让执行器回到安全位置比如转向放松、扭矩清零。3.3 安全机制在代码层面的落地AURICS内置了很多安全机制比如SMUSafety Management Unit、内存ECC、时钟监控、电压监控。这些硬件能力都很好但要在代码里去响应它们。拿SMU来说当芯片监测到某个故障内存错误、时钟失锁、供电异常SMU会根据配置触发一类或者多类安全反应写入故障通道、产生中断或者直接复位系统。我们需要在启动时初始化SMU把每种故障配置成合适的响应方式。这里有个常见的坑把太多故障配置成复位。有些故障是可以恢复的比如某次CRC校验失败如果你直接复位整个域控制器车里的人会明显感觉到系统重启这在行驶中是极其危险的。合理的做法是把这类可恢复故障配置成中断在中断处理里做降级操作然后复位对应的外设。内存ECC也是类似。AURIS的Flash支持带ECC的读写但ECC有两种模式一种是读时发现单比特错误自动纠正一种是多比特错误直接报错。实际项目中我会在开发阶段专门做一个脚本扫描整个Flash空间把多比特错误报警抓出来看看是不是有野指针或者内存越界写导致的。通过这种方式能提前发现很多难以复现的内存问题。4. 排查问题与功能安全认证经验4.1 锁步内存调试的常见陷阱在所有AURICS调试问题里锁步核相关的是最让人头疼的。因为锁步核是两个核同时执行调试器去读CPU寄存器的时候看到的是哪个核的状态这个问题如果搞不清楚容易把工程师带偏。我在项目里遇到过这样的情况代码里有个全局变量逻辑上看应该被某个函数更新但通过调试器观察时它一直没变。后来发现这个函数被分配在锁步核上执行而调试器看到的CPU寄存器是另一个普通核的。这种伪故障特别容易误导人。后来我们调整了调试策略对于锁步核在调试开始时先确认当前被调试的核心ID然后通过AURICS的调试接口把锁步比较模块临时关掉等运行到关键断点时再打开比较才能正常看变量值。还有一个很经典的坑锁步核配合实时数据追踪时Trace工具有时候会丢包。因为锁步核的Trace信息量比普通核大一倍数据带宽不足时会丢。这种情况下检查Trace配置里的数据过滤规则比如只追踪特定内存地址的写操作可以显著降低干扰。4.2 MPU配置引起的偶发故障AURIS每个核都有MPU内存保护单元它负责划定当前任务的合法内存访问范围。MPU用得好能大大提升安全等级但配置不当也会带来一系列偶发问题。比较常见的是“偶发性HardFault”程序跑几十分钟到几个小时后突然异常复位后又能正常工作。这种问题如果一直开着MPU往往就是访问了本任务之外的地址。排查思路分两步先通过调试器读取MPU的故障地址寄存器确认具体是哪个地址触发异常然后根据这个地址倒推是哪段代码在访问。如果故障地址飘忽不定很可能是栈溢出破坏了一堆数据那时候就需要去查看任务栈的剩余空间而不是死盯某一个指针。我见过一个项目问题出在DMA外设上。DMA控制器配置的目标地址在内存布局上属于另一个核的受保护区域CPU侧读数据看似正常但DMA写的时候跨了MPU边界时不时的产生一次总线错误。这个问题的根源是芯片的内存分区表在初始化时没和MPU配置保持一致后来我们专门写了一个启动时的自校验函数遍历所有MPU区和硬件内存映射表做比对整个项目再没出现过类似的偶发故障。4.3 从认证角度倒推MCU配置做汽车电子项目最终躲不开功能安全认证。英飞凌一直在强调AURIS符合ISO 26262但这件事对工程师最大的影响不是“芯片达标”而是“你要按照安全手册来设计”。安全手册里对MCU的每个模块都有明确要求哪个模块必须开启安全机制哪个模块允许配置成无校验模式以及启动阶段的诊断覆盖率怎么计算。这些内容直接决定你的配置方式。比如认证审核员在看你的系统时一定会问AURICS的窗口看门狗有没有启用SMU的故障分发策略是什么MPU分区是否覆盖了所有关键内存段如果你回答不上来整个体系就站不住脚。所以在项目一开始就不要只想着“怎么样程序跑得快”而是先配置一套符合安全手册的基础工程包括窗口看门狗、SMU、MPU最小配置这些基础再往上叠加业务逻辑。否则业务做完了再回头补安全配置你会发现处处受限制甚至可能导致整个软件架构重构。我个人的习惯是先做一份“功能安全配置需求矩阵”把所有MCU安全相关模块列出来每一行对应一个需求来源、配置目标、验证方法。这样无论是开发过程中自查还是最后审核都有据可查也方便不同模块之间的工程师互相review。还有一点想特别提醒不要迷信芯片的手册和启动示例。AURICS的启动示例是为了演示功能的并不一定适合量产工程。很多示例代码默认关闭了安全机制你直接用的话等于把芯片的安全部件全部架空。量产版本一定要从最早期的demo代码开始就把安全机制全部打开后面开发过程中如果出现异常往往能提早发现和规避。从我自己的体验来看英飞凌MCU进入奥迪自动驾驶这件事真正值得关注的不是“某款芯片被某一个车型采用了”而是它代表了整个行业对车控MCU的期望方向高算力之外还必须具备足够的多核冗余、功能安全执行力以及工具链成熟度。做相关开发的时候如果能在项目早期就把安全机制、多核分配和处理逻辑想清楚后面会省下非常多的调试时间。这一点比单纯关注芯片型号更新换代实在得多。
返回列表