Aurix TC27x低优先级中断执行时高优先级中断无法触发问题求助
嘿,我之前在Aurix TC27x的开发项目里刚好碰到过一模一样的中断抢占问题,你的情况一看就是中断抢占机制没配置到位——毕竟TriCore架构本身是支持高优先级中断抢占低优先级的,肯定是某个环节漏了。咱们一步步排查解决:
先核对中断优先级的配置逻辑
TriCore的中断优先级由INTC模块管理,这里有个容易踩的坑:优先级数值越小,实际优先级越高。比如你得把5µs触发的高优先级中断的INTC.IPR[n]寄存器值设得比100µs的低优先级中断小(比如高优先级设为2,低优先级设为10)。另外还要确认抢占优先级层级,TriCore的中断分抢占优先级和子优先级,必须保证高优先级中断的抢占等级明确高于低优先级的,不能只设置子优先级。确认全局抢占开关是否开启
你得检查CPU核心的CPUx.CPUCR寄存器里的PCE(Preemption Control Enable)位是否置1——这是全局允许中断抢占的总开关,如果没开,哪怕优先级再高也没法抢占正在执行的低优先级中断。可以用这段代码确认并开启:// 以CPU0为例,其他核心同理 if (!(CPU0.CPUCR & (1 << 0))) { CPU0.CPUCR |= (1 << 0); // 开启全局中断抢占控制 }排查低优先级中断服务函数里的“自屏蔽”操作
有时候在低优先级ISR里,可能不小心加了关闭全局中断的代码(比如调用disableInterrupts()),或者修改了CPUx.ICR寄存器的IL位(中断屏蔽等级),把屏蔽等级设得比高优先级中断的等级还高,导致高优先级触发时被屏蔽。你得仔细检查低优先级ISR的代码,确保没有这类操作,或者如果有临时关闭的需求,一定要及时恢复中断状态。验证高优先级中断的触发源是否正常
别忽略最基础的点:确认5µs触发的高优先级中断源(比如定时器)确实在按时触发。可以用示波器测一下触发引脚的波形,或者在高优先级ISR里加个GPIO翻转操作,看实际触发间隔是不是5µs,避免因为触发源配置错误导致的“假抢占失败”。检查中断栈的配置有效性
TriCore的中断上下文切换依赖中断栈,如果CPUx.ISP寄存器指向的中断栈地址无效,或者栈大小不够,可能会导致抢占失败。你得确认中断栈的起始地址和大小配置正确,足够容纳上下文切换时需要保存的所有寄存器内容(一般至少要预留几百字节的空间)。
如果以上步骤都排查完,高优先级中断应该就能正常抢占低优先级的了。要是还不行,可以用调试器暂停在低优先级ISR执行过程中,查看INTC.IHR寄存器里高优先级中断是否处于挂起状态,同时检查CPUx.ICR的IL位数值,就能快速定位是中断被屏蔽了还是压根没触发。
内容的提问来源于stack exchange,提问作者kishore

