0

我正在使用 Aurix Tricore TC27x 板。这里我使用了两个中断,一个中断每 5us(高优先级)发生一次,另一个中断每 100us(低优先级)发生一次。执行 100us(低优先级)中断的时间为 40us,因此在执行 100us(低优先级)中断时,如果 5us(高优先级)中断发生,则不会发生上下文切换。

完成低优先级中断后,只有切换到高优先级中断。因此,我丢失了数据。

为什么不被抢占?

提前致谢。

4

2 回答 2

0

在安装中断处理程序时尝试使用 __bisr(IPRN),这将允许高优先级中断中断低优先级中断。我不确定这是否包含在所有编译器中,但绝对可以用于任务编译器。

于 2019-02-10T11:38:27.953 回答
0

正如 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”。

于 2021-10-11T15:29:13.643 回答