4. 任务调度策略选型

在AURIX TC3xx这类多核ECU上,调度策略选型不是“哪个更先进”的问题,而是“哪个策略能在给定核数、负载、抖动容忍度和安全等级下,把最坏情况执行时间(WCET)与响应抖动同时压进预算”的问题。静态优先级抢占(FP)、时间触发(TT)和混合调度(FP+TT)三种策略,本质上对应三种不同的时间确定性来源:优先级决定“谁先跑”,时间片决定“何时跑”,混合则把两者按任务类别切分。选型的核心是识别任务的时间语义——是事件驱动、周期采样,还是安全关键同步。

一、三种策略在AURIX上的时间语义差异

静态优先级抢占调度(Fixed-Priority Preemptive)依赖AURIX的STM(System Timer)产生tick,或由GPT12/CCU6触发中断,在ISR中调用调度器选择最高优先级就绪任务。其确定性来自优先级分配和WCET上界,响应时间由RTA(Response Time Analysis)给出:R_i = C_i + Σ_{j∈hp(i)} ⌈R_i/T_j⌉·C_j。在TC3xx单核上,若最高优先级任务集利用率U≤0.69(Rate-Monotonic界),可保证可调度。但多核共享资源(如SRI总线、DMA、Flash)会引入干扰,使实际R_i比单核分析值高15%~40%。

时间触发调度(Time-Triggered)则把时间轴切成固定槽(slot),每个槽绑定一个任务或任务段,由GTM的TOM/ATOM或STM比较匹配触发,不依赖优先级抢占。其确定性来自“时间槽—任务”的静态映射,抖动可控制在微秒级。代价是灵活性差:事件到达若错过槽,必须等下一轮,且槽内任务超时会直接破坏后续所有槽。

混合调度(Hybrid)在AURIX多核上通常表现为:一个核跑TT调度器(如核0负责安全关键同步),其余核跑FP调度器(核1~核3处理事件驱动任务),核间通过共享内存+自旋锁或消息队列通信。TT核提供全局时间基准,FP核在非关键窗口内响应事件。

AURIX TC3xx 多核调度策略时间轴对比(示例:3核,10ms主周期) 核0:时间触发(TT)— 安全关键同步 Slot0 扭矩监控 Slot1 角度同步 Slot2 看门狗喂狗 Slot3 故障采集 Slot4 通信校验 Slot5 空闲/预留 抖动 ≤ 2μs,槽超时即触发SMU报警 核1:静态优先级抢占(FP)— 事件驱动任务 P3 喷油 P2 点火 P1 诊断 P3 喷油 P2 点火 P1 诊断 P3 喷油 响应抖动 20~80μs,受SRI总线干扰影响 核2:混合调度 — TT窗口 + FP窗口交替 TT窗口 同步 FP窗口 事件响应 TT窗口 校验 FP窗口 通信 TT窗口内禁止FP抢占,FP窗口内允许高优先级中断 选型判据:安全目标ASIL-D且抖动≤5μs → TT;事件密集且可容忍20μs抖动 → FP;两者共存且核间耦合低 → 混合 AURIX关键约束:SRI总线带宽、DMA通道冲突、Flash预取延迟、核间中断(IR)延迟

二、AURIX多核下的适用边界

静态优先级抢占在AURIX上的适用边界是:任务集周期相对稳定、事件到达率可界定、且最坏响应时间可分析。典型场景是核1上的喷油/点火任务,周期1ms~10ms,优先级按RM分配。但若事件源(如CAN FD突发帧)到达率不可控,FP的响应时间上界会迅速恶化。此时需要给低优先级任务设置“执行预算”,用AURIX的GTM定时器做时间保护,超预算即挂起并记录DET错误。

时间触发调度的边界更硬:它要求所有任务在编译期确定槽位,且槽内WCET必须小于槽长。在TC3xx上,TT调度器通常由STM比较中断驱动,槽切换开销约1~3μs。若槽长设为100μs,则有效计算时间约97μs。TT不适合处理突发诊断请求或标定XCP命令,因为这些事件无法预知到达时刻。因此TT核通常只跑安全监控、同步和固定节拍控制。

混合调度的边界在于核间耦合度。若TT核与FP核共享大量数据(如扭矩请求、转速),则必须设计无锁环形缓冲或双端口RAM,并限制FP核在TT窗口内对共享区的写操作。AURIX的LMU(Local Memory Unit)和SPRAM可划分给不同核,减少SRI争用。工程上常用“TT核做主、FP核做从”的架构:TT核在每个主周期起始广播同步信号,FP核收到后对齐自己的tick。

三、工程取舍:从WCET预算到核间干扰

选型时先做WCET预算表。以TC377为例,假设主频300MHz,核0跑TT,核1跑FP,核2跑混合。TT槽长100μs,6个槽,槽内任务WCET分别为15μs、20μs、10μs、25μs、18μs、5μs,总93μs,余量7μs。FP核任务集:P3喷油C=12μs/T=1ms,P2点火C=8μs/T=2ms,P1诊断C=30μs/T=10ms。按RTA计算,P3响应时间约12μs,P2约20μs,P1约50μs,均小于周期。但若SRI总线被TT核的DMA传输占用,FP核的Flash取指延迟可能增加,实际C值需乘以1.2~1.5的干扰因子。

核间干扰的量化方法是:在TT核注入已知负载(如连续DMA搬移),测量FP核任务的实际执行时间增量。若增量超过预算的20%,则需调整DMA优先级或把FP核的关键代码搬到LMU。AURIX的DMA通道可配置优先级,通常把TT核的DMA设为高优先级,FP核的DMA设为低优先级,但这样会拉长FP核的通信延迟。

工程建议:在TC3xx上,若系统ASIL-D且要求抖动≤5μs,优先选TT;若事件驱动任务占比>60%且抖动容忍≥20μs,选FP;若两者兼有且核间数据流清晰,选混合,但必须为TT核预留独立DMA通道和LMU空间。

四、配置示例:混合调度下的核间同步

以下为核0(TT)与核1(FP)的同步配置片段,基于AURIX iLLD风格。核0在每个主周期起始通过STM比较中断置位共享标志,核1在FP调度器入口读取该标志并校准本地tick。

/* 核0:TT主周期起始 */
void TT_MasterTick(void) {
    IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
    IfxStm_increaseCompare(&MODULE_STM0, IfxStm_Comparator_0, 300000); /* 1ms @300MHz */
    g_sharedSyncFlag = 0xA5A5;  /* 写入共享RAM */
    __dsync();
}

/* 核1:FP调度器入口校准 */
void FP_SchedulerEntry(void) {
    if (g_sharedSyncFlag == 0xA5A5) {
        g_sharedSyncFlag = 0;
        g_localTickOffset = IfxStm_get(&MODULE_STM1) - g_expectedTick;
        if (g_localTickOffset > 50) {  /* 偏差>50μs */
            g_syncErrorCount++;
        }
    }
    /* 正常FP调度 */
    scheduleHighestPriority();
}

判断同步是否达标:连续运行1000个主周期,g_syncErrorCount应小于3;若超过,说明核1的FP任务被长时间阻塞,需检查SRI总线仲裁或降低FP核的DMA负载。实测中,若TT核DMA搬移1KB数据耗时约2μs,FP核的Flash取指延迟可能增加0.5~1μs,属于可接受范围。

五、选型决策表

判据静态优先级抢占时间触发混合调度
抖动要求20~80μs≤5μsTT部分≤5μs,FP部分20~50μs
事件响应好差(需等槽)中(FP窗口内好)
WCET可分析性中(需RTA)高(静态槽表)中高(分域分析)
AURIX核间干扰敏感低(时间隔离)需设计共享区
典型核分配核1~核3核0核0 TT + 核1/2 FP

最终取舍应回到系统级:先确定安全目标对抖动和确定性的硬约束,再评估事件密度和核间数据流,最后用WCET预算和干扰因子验证。AURIX的硬件特性——STM、GTM、DMA优先级、LMU分区——决定了三种策略的落地成本。没有绝对最优,只有与当前ECU任务集和ASIL等级最匹配的组合。