第二章 AURIX TC3xx 锁步架构概览

2.1 TC3xx 多核架构:不止是堆核心

好,咱们直接进入正题。AURIX TC3xx 的多核架构,我第一次接触时也觉得眼花缭乱。三核、六核,甚至还有更多配置。但说白了,它并不是简单地把几个 CPU 塞在一起。

我个人习惯把 TC3xx 的核分成两类:应用核锁步核。应用核就是咱们平时跑主程序的,比如控制算法、通信协议栈。而锁步核,嗯,它是个“影子武士”。

你想想看,在汽车里,一个错误指令可能导致刹车失灵。所以功能安全要求“冗余”。TC3xx 的做法是:让两个核执行完全相同的指令,然后比较结果。这就是锁步的雏形。

我记得在做一个 EPS(电动助力转向)项目时,客户要求 ASIL-D 等级。当时我就想,如果没有锁步核,光靠软件做冗余,那代码量得翻倍,而且时序分析会让人崩溃。硬件锁步,说白了就是帮你把最底层的安全检查给扛了。

2.2 主核与锁步核的配对关系

TC3xx 里,并不是所有核都配锁步伙伴。具体配对关系,我整理了一个表格,这样更直观:

核心类型 配对关系 典型用途
CPU0 (主核) 与 CPU1 组成锁步对 安全关键任务(如监控、故障处理)
CPU1 (锁步核) CPU0 的影子,无独立程序 仅用于比较,不执行用户代码
CPU2 (独立核) 无锁步伙伴 非安全任务(如通信、诊断)
CPU3 (独立核) 无锁步伙伴 高性能计算(如算法加速)

这里有个关键点:锁步核本身不跑你的代码。它只是主核的一个“克隆体”。主核取指令,它也取;主核算数据,它也算。然后硬件自动比较每一步的结果。

核心要点:锁步对 (CPU0+CPU1) 在软件看来就像一个核。你只需要给 CPU0 编程,CPU1 自动同步。这大大降低了开发难度。

我曾经见过一个团队,试图在锁步核上单独跑一个监控任务。结果发现,锁步核的寄存器访问受限,而且一旦写入不一致,立即触发故障。嗯,这里要注意:锁步核不是给你用的,是给你“防错”的

2.3 锁步核的硬件实现原理

好,咱们深入一点。锁步核到底是怎么工作的?我尽量用大白话讲清楚。

TC3xx 的锁步机制,核心是 “延迟比较”。什么意思呢?

  1. 输入同步:主核和锁步核接收完全相同的输入信号。比如同一个中断、同一个总线数据。
  2. 指令流复制:两个核从同一个程序存储器取指令。注意,是同一个地址,同一个时刻。
  3. 执行与延迟:锁步核故意比主核慢几个时钟周期(通常是 2 个周期)。为什么要延迟?
  4. 结果比较:主核的结果先出来,锁步核的结果后出来。比较器在锁步核结果出来后,对比两者是否一致。

为什么会这样设计?我解释一下。如果两个核完全同步,一个瞬间的电压毛刺可能同时影响两个核,导致它们算出相同的错误结果。延迟几个周期后,毛刺的影响可能错开,从而被比较器捕获。

避坑指南:我曾经在调试一个随机故障时,发现锁步比较器偶尔报错。后来查了三天,发现是时钟树上的一个去耦电容虚焊,导致时钟抖动。锁步核的延迟比较,恰恰暴露了这个硬件缺陷。所以,锁步报错不一定是软件问题,也可能是硬件隐患

再来看具体的硬件模块:

  • 比较器 (Comparator):位于 CPU 内部,专门比较两个核的写操作、寄存器更新、总线访问。
  • 故障收集单元 (FCU):当比较器发现不一致,FCU 会记录错误类型和地址。你可以配置它触发中断,或者直接复位。
  • 安全机制:锁步核本身也有自检逻辑。比如定期注入一个错误,看比较器能不能抓到。这叫“故障注入测试”,是 ISO 26262 要求的。

我建议你在做系统设计时,把锁步核的故障响应时间算进去。从错误发生到 CPU 收到中断,大概需要几十个时钟周期。如果你的控制环路要求 1 微秒内响应,那这个延迟可能是个瓶颈。

警告:锁步核不是万能的。它只能检测“瞬时故障”和“永久故障”中的一部分。比如两个核同时被宇宙射线打中,且翻转的位相同,那比较器就抓不到。这种“共因失效”需要靠其他手段(比如 ECC 内存、冗余传感器)来覆盖。

2.4 我的经验总结

讲了这么多,我总结几条实战经验:

  • 别把锁步核当普通核用。它没有独立的中断向量表,也不能单独调试。你只能通过主核间接控制它。
  • 锁步对适合跑“确定性”代码。比如状态机、CRC 计算。不适合跑依赖随机数的算法,因为两个核的随机数种子可能不同步。
  • 调试时记得关掉锁步。TC3xx 允许在调试模式下禁用锁步比较。否则你单步执行时,主核走了,锁步核没走,立马报错。我刚开始就吃过这个亏。

嗯,锁步架构这部分,说白了就是硬件帮你做“双机热备”,但比软件实现可靠得多。下一章咱们会讲怎么配置锁步核,以及如何利用它的诊断功能。