我正在使用 Aurix Tricore TC27x 板。这里我使用了两个中断,一个中断每 5us(高优先级)发生一次,另一个中断每 100us(低优先级)发生一次。执行 100us(低优先级)中断的时间为 40us,因此在执行 100us(低优先级)中断时,如果 5us(高优先级)中断发生,则不会发生上下文切换。
完成低优先级中断后,只有切换到高优先级中断。因此,我丢失了数据。
为什么不被抢占?
提前致谢。
我正在使用 Aurix Tricore TC27x 板。这里我使用了两个中断,一个中断每 5us(高优先级)发生一次,另一个中断每 100us(低优先级)发生一次。执行 100us(低优先级)中断的时间为 40us,因此在执行 100us(低优先级)中断时,如果 5us(高优先级)中断发生,则不会发生上下文切换。
完成低优先级中断后,只有切换到高优先级中断。因此,我丢失了数据。
为什么不被抢占?
提前致谢。
在安装中断处理程序时尝试使用 __bisr(IPRN),这将允许高优先级中断中断低优先级中断。我不确定这是否包含在所有编译器中,但绝对可以用于任务编译器。
正如 Martin James 在他的评论和 Steve Mitchell 在他的回答中已经提到的那样,您需要在 ISR 中重新启用中断。在 TASKING Compiler 中,这通过__enable_
函数定义中的语句更直观地完成:
void __interrupt(YOUR_INT_PRIO) __vector_table(YOUR_INT_PROVIDER) __enable_ name_of_your_isr (void)
{
/* this ISR may be interrupted */
/* your code here */
}
如果不使用该__enable_
语句,则不能中断 ISR,即使它的优先级低于最近的优先级。完成 ISR 后,所有待处理的 IQR 中具有最高优先级(=最高编号)的 IRQ 被服务。
void __interrupt(YOUR_INT_PRIO) __vector_table(YOUR_INT_PROVIDER) name_of_your_isr (void)
{
/* this ISR will NOT be interrupted */
/* your code here */
}
对于其他编译器,请阅读您的编译器的用户手册或查看英飞凌关于中断系统部分的“TriCore TC1.6P & TC1.6E Core Architecture User Manual”。