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多核下的适用边界
静态优先级抢占在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核的通信延迟。
四、配置示例:混合调度下的核间同步
以下为核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μs | TT部分≤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等级最匹配的组合。