全球即时:Aurix:中断仲裁过程
来源:个人图书馆-新用户3849ayns    时间:2023-06-21 15:34:31


(相关资料图)

之前和大家聊过Aurix的中断,可以参考前文英飞凌tx397:手撕中断,让你理解得更明白。在聊中断仲裁过程之前,问一个问题:“同一个中断,在执行其中断例程的过程中,如果。所以,默认情况下,中断例程执行过程中,相同的中断再次发生,中断例程不会被打断,需要等到该中断例程执行完成以后再进行仲裁,如果赢得了仲裁才能再次执行该中断例程。如果中断可以嵌套,CPU需要对挂起的中断优先级PIPN和正在执行的中断优先级CCPN比较,如果CCPN≥ PIPN,当前中断例程无法被打断。同一个中断,连续发生,在第一次中断例程没有执行完之前,此中断例程不会重新执行,因此,中断例程不能像递归函数那样,不断地调用自己。所以,这就是开篇的答案;为了确保数据一致性,经常会在代码中看到__disable()和__enable()这样的内嵌接口,这两个接口的实质是控制ICR(Interrupt Control Register)寄存器的IE,控制全局中断的关闭和使能。中断例程执行前,别忘了先清除中断挂起标志位(通过向SRC.CLRR写1,清除SRC.SRR)。同时,中断例程执行结束后,根据需要,决定模块的中断功能是否使能,对应的手册中,一般会给出注释描述。tc3xx手册的提示如下所示:如果中断允许嵌套,即:2类中断可以被高优先级中断打断,需要在中断例程执行前,重新使能全局中断。如果系统使用了OS,重新使能全局中断的动作可由OS完成。而在Boot项目中,程序多数手写,很多Boot不用OS,默认中断不允许嵌套,如果想允许中断嵌套,需要重新使能中断功能。

2、Tricore架构中,中断不可打断的几个条件

解释:全局中断禁用期间(ICR.IE = 0),即使有新的中断挂起(eg:更高优先级的中断),CPU不会去处理;当前CPU的CCPN(Current CPU Priority Number )比新请求的PIPN(Pending InterruptPriority Number)优先级高,CPU不会立刻处理新的中断请求;中断例程执行过程中,如何实现中断抢占?

某中断例程ISR(Interrupt Service Routine)正在执行;

在此期间,新的中断被挂起(SRR:Service Request Flag = 1);

判断中断是否可以嵌套(ICR.IE == 1?),如果中断可以嵌套,且挂起的中断优先级PIPN(Pending Interrupt Priority Number)比正在执行的中断例程优先级高CCPN(Current CPU Priority Number ),则当前正在执行的中断例程被打断,执行新的中断例程ISR(new),中断发生抢占。

默认情况下(中断不允许嵌套),CPU如果已经在执行中断例程或者Trap例程,新挂起的中断服务请求不会立刻执行。所以,中断例程的代码不要过长,以免影响任务执行的时序,特别对时间要求严格的系统,中断例程执行时间过长,可能会导致某些任务执行时间超时;CPU正在处理非可屏蔽中断服务、多Cycle指令或者正在操作ICR寄存器,新挂起的中断服务,不会立刻处理。参考资料

Infineon-AURIX_TC3xx_Part1-UserManual-v01_00-EN.pdf

Infineon-AURIX_TC3xx_Architecture_vol1-UserManual-v01_00-EN.pdf

关键词:

X 关闭

X 关闭