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.

[参考译文] TMS320F28374S:嵌套中断中的 DINT

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1255044/tms320f28374s-dint-in-nested-interrupts

器件型号:TMS320F28374S

您好!

根据 https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html 、嵌套中断的结构如下:

void EPWM1_TZINT_ISR (void)

uint16_t TempPIEIER
TempPIEIER = PieCtrlRegs.PIEIER2.all//稍后保存 PIEIER 寄存器 
IER |= 0x002//通过调整 IER 设置全局优先级 
IER &= 0x002
PieCtrlRegs.PIEIER2.all &= 0x0002//通过调整 PIEIER2来设置组优先级,以允许 INT2.2中断当前 ISR 
PieCtrlRegs.PIEACK.all = 0xFFFF//启用 PIE 中断 
ASM (" NOP"); //等待一个周期 
EINT//清除 INTM 以启用中断 
// 
//在此处插入 ISR 代码…… 
//现在只需要插入一个延迟 
// 
for (i = 1i <= 10i++){} 
// 
//恢复寄存器已保存: 
// 
Dint
PieCtrlRegs.PIEIER2.all = TempPIEIER


假设、我不想在 ISR 末尾更改组优先级、"DINT"仍然是错误的吗?
因此、DINT 只需用来保护 PIEIER、PIEACK 等 ISR 源代码内重要寄存器的写入。。。
或者在切换期间为了保护最后三个自动软件步骤、
ISR 已完成:
1.手动上下文恢复(如果需要)
2.执行 NASP 指令
3.执行 IRET 指令


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

    您好!
    确实需要 DINT (例如勘误表中提到了这一点)、但较新版本的编译器会注意这一点、并在退出嵌套中断时自动禁用中断。 您可以检查装配以确保(    在 IRET 之前、您将看到几条"SETC INTM、DBGM"的说明)。
    我不记得哪个编译器版本是第一个采用此行为的编译器、但 CGT 22.6.0肯定会采用该版本。

    此致、
    安迪

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

    Andy、您好!

    感谢您的答复。 现在我很清楚。

    另一个问题:是否甚至需要保护对寄存器的写入(PIEIER、PIEACK、外设中断标志等)?

    所以、我在 ISR 的最后添加 DINT 是否也没有问题?  

    例如:

    ...

    // ISR 代码 
    PieCtrlRegs.PIEIER2.all = TempPIEIER
    dint
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html 中的示例 显示、当 PIEIER 被修改时、在恢复 PIEIER 的旧值之前、中断将被禁用。 我真的不知道不这样做是否会有任何副作用、只依靠编译器插入的 DINT。 但是、在我使用此类情况的所有代码中、我 确实会在恢复 PIEIER 之前手动禁用中断。

    手册或上面的 wiki 中没有很好地描述整个中断嵌套在 C2000中。 wiki 已经过时了。 它没有提到编译器制造的 DINT、它也不涉及必须修改不同于您所在 ISR 的不同 PIE 组的 PIEIER (具有5 nops 的特殊情况在 TRM 的"禁用中断"一章中进行了介绍)。 TI 应对此进行更新-从一个位置收集所有信息。 至于现在、用户必须查看不同的位置(wiki、TRM、这个论坛)。

    此致、
    安迪