This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:VIM/Arm 内核与 Micrium 的交互(虚拟 IRQ)

Guru**** 2467750 points
Other Parts Discussed in Thread: TMS570LC4357

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667612/tms570lc4357-vim-arm-core-interaction-phantom-irq-with-micrium

器件型号:TMS570LC4357

大家好、我将 Micrium uCOS III 与 TMS570LC4357搭配使用、并尝试调试幻象中断问题。  我已经阅读 了 spna063.pdf 、但仍然不太了解防止幻象中断的核心/VIM 相关性。  是否有一个文档更清楚地描述了如何根据发生的中断和屏蔽活动来更新/清除索引寄存器(IRQINDEX、VIM 中的偏移0)?  以及在此过程中如何触发内核?   时序图很好。  如果逻辑图显示了 spna063的情形2中描述的竞态条件、即使是逻辑图也会有所帮助。

在我的当前配置中、有2个中断被启用、RTI (索引= 4、IRQ 通道= 3)和 DCAN3 (索引= 46、IRQ 通道= 45)。  未使用 FIQ。  所有中断均通过 IRQ 矢量进行功能处理、操作系统在处理特定请求时通过屏蔽所有较低优先级的中断来"管理"中断。  我看到两种情况-

发生 RTI、当中断被重新启用时、一个嵌套 CAN 中断发生、当被处理时、在索引寄存器中增加一个"0"。  请注意、我知道处理哪个 IRQ 的方法是在服务的早期添加了一些汇编代码、以便根据是 RTI 还是 CAN 来读取索引和切换 GPIO 位。  我还在 Micrium "嵌套 IRQ 检测"部分切换 GPIO 位。  似乎每次检测到嵌套中断时都会生成幻象中断。  虽然很少见、但我不明白如何防止、或者它实际上是否是问题-我没有查看帧是丢弃还是以后处理帧。

2、 产生一个 CAN 中断、另一个 CAN 中断嵌套会引起幻象中断。  这一点我真的不理解、因为我在 CAN 服务期间不会重新启用中断。  我的理解是、当 IRQ 被处理时、CPSR 位7被置位、从而在服务的持续时间内禁用中断。  因此、在这种情况下、除非通过清除 CPSR 位7 (我不是这样)显式重新启用中断、否则我看不到 CAN 中断可能嵌套的方式。  但我肯定会看到它。

在标准 Micrium 配置中、IRQ 索引寄存器在 ISR 中的读取时间不是很早、这一点似乎不太正确。  似乎需要提前进行一些内部整理。  这只是我注意到的问题、可能是问题、也可能不是问题。  不过,我认为尽快把指数捕捞出来,可能会减低种族状况。  但是、再次提前读取索引可能会将同一问题移至更早的时间。  

如果您有任何想法或信息、我们将不胜感激。  我将包括优先级/屏蔽例程-我添加了行" if (ch_ix =0U)... " 来中止幻象中断的服务。  如果没有这一行代码、代码将锁定-在调用特定 ISR 之前重新启用中断时、幻象中断将保持。

void bsp_IntHandlerSrc (CPU_INT16U src_id)
{
CPU_Fnct_PTR ISR_fnct;
CPU_REG32 p_vim_tbl;
CPU_INT32U ch_ix;
CPU_INT32U Pend_reg_0;
CPU_INT32U Pend_reg_1;
CPU_INT32U Pend_reg_2;
CPU_INT32U Pend_reg_3;
CPU_INT32U Pend_mask;

开关(src_id){
示例 OS_CPU_ARM_FLOW_IRQ:
CH_IX =(CPU_INT32U) BSP_INT_REG_IRQ_INDEX;
if (ch_ix =0U){ phantomIRQcnt++;break;/* phantomInterrupt ();*/}
P_vim_tbl =(CPU_REG32 *) BSP_INT_ADDR_INT_TBL;
ISR_fnct =(cpu_Fnct_ptr) p_vim_tbl[ch_ix];

ch_ix--;
if ((ch_ix =16U)||(ch_ix =35U)||(ch_ix ==45U)||(ch_ix ==113u)){
//在不启用中断的情况下执行 ISR
(* isr_fnct)((void *) ch_ix);//调用 ISR,并将其作为参数传递给通道。 *
中断;
}

if (isr_fnct!=(cpu_Fnct_ptr) 0){

Pend_reg_0 = BSP_INT_REG_REQENACLR0; /*存储中断状态 *
Pend_reg_1 = BSP_INT_REG_REQENACLR1;
Pend_reg_2 = BSP_INT_REG_REQENACLR2;
Pend_reg_3 = BSP_INT_REG_REQENACLR3;

if (ch_ix <= 31){ /* Dis。 所有优先级低于当前*/的中断
Pend_mask = 0xFFFFFFFF << ch_ix;
bsp_int_REG_REQENACLR0 = Pend_MASK;
BSP_INT_REG_REQENACLR1 = 0xFFFFFFFF;
BSP_INT_REG_REQENACLR2 = 0xFFFFFFFF;
BSP_INT_REG_REQENACLR3 = 0xFFFFFFFF;
} 否则、如果(ch_ix <= 63){
Pend_mask = 0xFFFFFFFF <<(ch_ix - 32);
bsp_int_REG_REQENACLR1 = Pend_MASK;
BSP_INT_REG_REQENACLR2 = 0xFFFFFFFF;
BSP_INT_REG_REQENACLR3 = 0xFFFFFFFF;
} 否则、如果(ch_ix <= 95){
Pend_mask = 0xFFFFFFFF <<(ch_ix - 64);
bsp_int_REG_REQENACLR2 = Pend_MASK;
BSP_INT_REG_REQENACLR3 = 0xFFFFFFFF;
} 否则{
Pend_mask = 0xFFFFFFFF <<(ch_ix - 96);
bsp_int_REG_REQENACLR3 = Pend_MASK;
}

//在启用中断的情况下执行所有其它 ISR
cpu_inten(); /*启用高优先级中断 *
(* isr_fnct)((void *) ch_ix);//调用 ISR,并将其作为参数传递给通道。 *
cpu_IntDiss(); /*禁用中断 *

BSP_INT_REG_REQENASET0 = PEND _REG_0;/*恢复原始中断状态 *
bsp_int_REG_REQENASET1 = Pend_reg_1;
bsp_int_REG_REQENASET2 = Pend_reg_2;
bsp_int_REG_REQENASET3 = Pend_reg_3;
}
否则{nullIRQcnt++;}
中断;

OS_CPU_ARM_FLOW_FIQ 情况: /*参见注1。 *
默认值:
中断;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dan、您好!

    我不熟悉 Micrium。 没错、TMS570不支持硬件中的嵌套中断。 当一个 IRQ 被处理时、CPSR 位7被置位、IRQ 被禁用。

    本应用手册可能对您有所帮助。

    www.ti.com/.../spna219.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您提供相关信息-我将浏览应用手册。 不过、我仍在寻找有关内核和 VIM 交互方式的更好信息。 同样、时序图是理想的。 它需要显示在 spna063的情景2中暗示的比赛状态。 根据我的理解、当一个外设的中断恰好在执行指令来屏蔽中断发生的时刻出现时、这个问题就会出现。 在这种情况下、恰好在屏蔽之后、索引寄存器被更新(矢量被删除)、但是中断已经被传递到内核。 当内核对中断执行操作时、索引不再有效、并且虚拟发生。 1)我正在尝试弄清楚:1)如何防止这种情况发生;2)如果发生这种情况、它是否甚至会导致任何问题-似乎当屏蔽最终被移除时、中断仍应挂起、并重新生效并正确处理。 这是真的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dan、您好!

    我没有您提到的时序图。 该器件支持3种不同的软件处理中断的可能方式。 索引模式(传统)、寄存器矢量和硬件矢量 INT (ISR)。

    当一个外设内发生一个事件时、外设向 VIM 发出一个中断请求、然后 VIM 设定这些请求的优先级并将最高 ISR 的地址提供给 CPU。 CPU 开始从 ISR 中的地址执行 ISR 指令。

    例如、
    1:启用 GIO INT 和 GIO 引脚作为输入
    2.按下 launchpad 上的 GIO 按钮(GIOB4、GIOB5)
    3、VIM 将向 CPU 发出 INT 请求(寄存器矢量模式)并向 CPU VIC 端口提供 ISR 地址(HW 矢量中断模式)、并将 ISR 地址写入 IRQ 索引寄存器
    4. CPSR IRQ 位被清零
    5.跳转至 ISR
    6.读取 GIO 中断偏移寄存器--> VIM IRQ 索引寄存器将被清除以指向虚拟 ISR
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我了解支持的中断服务模式。 我知道应该发生什么-您的示例描述了一个简单的预期情况良好。 但是、我看到的是更复杂的一点、与预期的不匹配、涉及屏蔽寄存器。 在您的示例之后、直到第5点、所有内容都是相同的。 然后、我希望发生的是、

    5.跳转至 ISR
    6.屏蔽 VIM 中的 GIO INT 和所有其它低优先级中断
    7.另一个优先级较低的外设有一个 INT 请求(但应被屏蔽并挂起)
    8、中断被使能(SPSR IRQ 位被置位)、但是挂起的中断仍然被屏蔽
    9. GIO 中断偏移寄存器读取、GIO 服务清除 GIO INT、GIO 服务完成
    10.中断被禁用(SPSR IRQ 位被清除)
    11.在 VIM 中删除了中断屏蔽(GIO 屏蔽和其他较低优先级外设屏蔽)
    12.第一个 ISR 完成、弹出"正常"状态(重新启用中断)
    13.来自其他外设的挂起中断变为活动状态、使用其他外设 INT 从步骤1重复
    14.完成上述步骤12、无需第二个中断。

    发生的情况(观察到的情况)在上面的6到8之间、某种程度上、较低优先级的中断实际上会被内核注册并提供服务、而在此事件期间获取的索引会指示幻象中断。 我不知道这是怎么发生的。 因此,我对 spna063中提到的边缘案件感兴趣。 但我想如果没有更多信息、我将不得不弄清楚其他的东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dan、您好!

    您可以手动清除 SPSR 中的 IRQ 位以启用 GIO IRQ ISR 内的 IRQ 中断。 Cortex-R4不支持硬件中的嵌套中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 您的示例中的步骤4自动发生(CPSR IRQ 位被清除)、但在步骤8、10和11中、中断被明确设置/清除。 我知道该处理器不支持硬件中的嵌套中断。 此操作系统应处理软件中的嵌套中断。 但它的工作效果不是很好。 我正在尝试了解处理器硬件和操作系统的工作原理、以便我可以修复它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dan、您好!

    这是唯一一个与 Hercules MCU 上嵌套中断的软件解决方案相关的应用手册。 我很抱歉。

    www.ti.com/.../spna219.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、我认为您提供的信息现在将是必须的。