3. 实时域M7子系统设计

S32G 的实时域由多个 Arm Cortex-M7 内核构成,它们与负责应用处理的 Cortex-A53 集群共享芯片资源,但实时域的设计目标非常明确:以确定性的响应时间处理周期性控制、安全监控和低延迟 I/O。理解 M7 子系统的关键,不是把它当作"更快的单片机",而是把它看成一条从中断触发 → 向量响应 → 紧耦合内存取指/取数 → 外设寄存器访问 → 任务调度的确定性链路。本节围绕这条链路展开。

中断控制:从 NVIC 到 GIC 的职责划分

M7 内核内部集成嵌套向量中断控制器(NVIC),负责内核异常与外部中断的优先级仲裁、嵌套和尾链(tail-chaining)。NVIC 支持 8~256 个可配置优先级,S32G 实际使用中通常配置为 16 级或 32 级抢占优先级,数值越小优先级越高。中断源来自芯片级中断路由器(IRC),它把上百个外设中断请求映射到各 M7 内核的 NVIC 输入线上。

需要特别注意的是,M7 与 A53 之间的跨域中断不走 NVIC,而是通过 GIC 与 MSCM/IRC 的协同完成。典型做法是:A53 侧通过 GIC 的 SGI(软件生成中断)或共享外设中断触发,经 IRC 路由到目标 M7 的 NVIC。因此设计时要明确"谁产生、谁路由、谁响应"三段职责,避免中断在跨域路径上被重复使能或优先级反转。

中断优先级分配应遵循一条实用原则:越靠近物理时限的任务,优先级越高。例如电机 PWM 的周期中断(如 50 μs 周期)应高于通信接收中断,通信接收又高于状态上报。同时,同一优先级组内避免放入两个都可能长时间占用 CPU 的处理程序,否则尾链优化失效,抖动增大。

紧耦合内存(TCM):确定性的物理基础

M7 的紧耦合内存分为 ITCM(指令)和 DTCM(数据),它们直接挂在内核总线上,访问延迟固定且极低,不经过系统缓存和互连矩阵的仲裁。这是实时域确定性的物理基础:只要关键代码和数据放在 TCM,执行时间就基本可预测。

S32G 的每个 M7 通常配有 32 KB ITCM 与 32 KB DTCM(具体容量以具体型号参考手册为准)。TCM 的分配策略直接决定实时性能:

  • ITCM:放置中断向量表、中断服务程序(ISR)、控制环核心算法、频繁调用的数学函数。避免把大块非实时代码塞入 ITCM,否则会挤占关键路径。
  • DTCM:放置控制环状态变量、PID 参数、ADC 采样缓冲区、DMA 描述符。DTCM 不参与缓存一致性维护,因此与 DMA 交互时无需 cache clean/invalidate,简化了数据流。

一个常见的教学示例:将 1 kHz 电流环的 ISR 及其调用的 Clarke/Park 变换函数链接到 ITCM,把电流采样数组和 PID 状态放入 DTCM。此时 ISR 的最坏执行时间(WCET)主要由指令条数和 TCM 固定访问周期决定,不再受 A53 侧大流量访问 DDR 造成的总线争用影响。若同样的代码放在 DDR 并通过 cache 执行,则 WCET 会因 cache miss 和总线仲裁产生数倍波动。

低延迟外设访问:绕过缓存的直接路径

实时域的外设访问要区分两类对象:寄存器和数据缓冲区。寄存器访问必须绕过 cache,否则读到的是陈旧值。M7 通过 MPU(内存保护单元)把外设寄存器区配置为 Device 或 Strongly-ordered 属性,禁止缓存和推测访问。S32G 中 M7 可直接访问的外设包括 FlexCAN、LPSPI、LPI2C、ADC、eMIOS、FlexTimer 等。

数据缓冲区则更适合用 DMA 搬运。以 ADC 采样为例:ADC 转换完成触发 DMA 请求,DMA 把结果写入 DTCM 中的环形缓冲区,写满半缓冲区后产生中断,ISR 只处理数据而不搬运数据。这样 CPU 占用从"每次采样都进中断"降到"每半缓冲区进一次中断",抖动显著下降。

外设访问还有一个容易被忽视的细节:写缓冲与读回。对某些外设,配置寄存器写入后需要读回一次以确保生效,或在修改使能位前先关闭外设。这类顺序要求在外设参考手册中有明确说明,不能凭经验省略。

实时任务调度基础:优先级与时间片

M7 上常用的调度方式有三种:裸机前后台、基于 SysTick 的时间片轮询、以及 RTOS(如 FreeRTOS、AUTOSAR OS)。对于硬实时控制环,推荐"中断 + 高优先级任务"的混合结构:控制环由定时器中断直接驱动,通信和诊断放在低优先级任务中。

调度设计要回答三个问题:任务的周期是多少、WCET 是多少、优先级如何排。以 1 ms 控制任务和 10 ms 通信任务为例,若控制任务 WCET 为 80 μs,通信任务 WCET 为 400 μs,则通信任务必须可被控制任务抢占,否则控制周期会被拉长到 480 μs 以上,直接破坏控制质量。RTOS 中通过任务优先级和抢占式调度满足这一要求;裸机中则通过中断优先级和主循环分段处理实现。

下面这张图把上述链路串起来,展示从外设事件到任务执行的完整路径与各环节的确定性来源。

M7 实时域确定性链路 外设事件源 ADC 转换完成 eMIOS / FTM 定时 FlexCAN 接收 LPSPI 收发 中断路由 IRC 中断路由器 GIC ↔ NVIC 跨域 优先级映射 目标内核选择 NVIC 抢占优先级仲裁 嵌套 / 尾链 向量取址 低延迟入栈 紧耦合内存 TCM(固定延迟) ITCM 向量表 / ISR 控制环算法 DTCM 采样缓冲 / PID 状态 DMA 描述符 取指 / 取数 低延迟外设访问 寄存器直访 MPU 配 Device 禁缓存 / 禁推测 DMA 搬运 半缓冲中断 降低 CPU 占用 实时任务调度 高优先级:控制环 1 ms 周期 / WCET 80 μs 中优先级:通信 10 ms 周期 / WCET 400 μs 低优先级:诊断 100 ms 周期 / 可被抢占 事件驱动 确定 性 TCM 固定延迟

图中可以看到,确定性并非来自某一个模块,而是来自整条链路的每一段都可预测:外设事件有固定触发点,IRC/NVIC 有确定的仲裁延迟,TCM 有固定访问周期,寄存器访问绕过缓存,调度优先级保证高优先级任务不被低优先级任务阻塞。任何一段引入不确定性(例如把 ISR 放到 DDR、让低优先级任务长时间关中断),整条链路的实时性都会被拉低。

实践建议:在项目早期就用示波器或 GPIO 翻转法测量 ISR 的入口到出口时间,并记录最坏值。把测量点放在 ISR 第一条指令和最后一条指令处,可以直观看到 TCM 与 DDR 两种放置方式的差异,通常相差数倍。
常见误区:认为"主频高就一定实时"。M7 主频再高,如果关键代码不在 TCM、中断被低优先级任务长时间屏蔽、或外设寄存器被缓存,响应抖动依然会超出控制环允许范围。实时性是路径问题,不是频率问题。

把上述内容落到配置层面,一个可参考的起步顺序是:先用 MPU 划分 TCM 与外设区域属性,再把向量表和 ISR 链接到 ITCM、把控制状态放入 DTCM,然后配置 IRC 中断映射与 NVIC 优先级分组,最后建立任务优先级并测量 WCET。每一步都以"是否减少不确定性"作为判断标准,而不是以"是否跑通"作为唯一标准。