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.

[参考译文] TMS320F28027:C28x 内核中断处理例程

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/611271/tms320f28027-c28x-core-interrupt-service-routine

器件型号:TMS320F28027

尊敬的 C2000专家:

我使用 C 函数作为 ISR 入口、并希望在 C ISR 中调用汇编函数。 但是我发现、如果我在汇编函数的开头使用 ASP 指令、在函数的末尾使用 NASP 指令、那么 PC 就不能恢复到中断前的值。 您能告诉我原因吗? 使用 ASP/NASP 指令的限制是什么?

我的代码如下所示:

用于 ISR 入口的 C 函数:

//
// epwm1_timer_ISR -此示例中使用的中断例程
//
_interrupt void
epwm1_timer_ISR (空)

   EPwm1TimerIntCount++;

   Assembly_func();
   //
   //清除此计时器的 INT 标志
   //   
   EPwm1Regs.ETCLR.bit.INT = 1;

   //
   //确认此中断以接收来自组3的更多中断
   //
   PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

2.汇编函数代码:如果 ASP 和 NASP 指令在函数中、则在 ISR 完全执行后、PC 无法恢复为正确的值。  

;标签到_assembly_func 函数
.def _assembly_func

.text

汇编_func:
;上下文保存
ASP
按 AR1H:AR0H
按 XAR2
按 XAR3
按 XAR4
按 XAR5
按 XAR6
按 XAR7
按 XT


;--------------
;完整的上下文恢复
弹出 XT
弹出 XAR7
弹出 XAR6
弹出 XAR5
弹出 XAR4
弹出 XAR3
弹出 XAR2
弹出 AR1H:AR0H
NASP
LRETR;使用 RPC 的长返回

此致、

插孔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

    此致
    Baskaran
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    插孔、
    您无需在汇编函数中使用 ASP 或 NASP。 这些指令实际上用于中断、以确保在发生中断时堆栈保持偶数对齐。 C 编译器始终保持堆栈指针的偶数字对齐、因此您可以安全地将这些指令从汇编函数中删除。
    文档中没有明确说明、但正如您正确推测的那样、所发生的情况是、在汇编函数开始时、ASP 将改写 ST1寄存器中的 SPA 位、该位之前由 ASP 在 ISR 开始时写入。 这可能是错误的值会在 ISR 结束时损坏 NASP。
    注释掉 ASP 和 NASP、这样就可以了。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    插孔、

    我想通过使用来添加它

    按 AR0H:AR1H

    您只保护这些寄存器的高16位。 这通常在 ISR 中完成、因为自动中断上下文保存会处理两个寄存器的低16位。 在 C 函数调用中、编译器无论如何都会保护 XAR0、但您需要通过以下方式保护 XAR1 (如果使用):

    按 XAR1

    与上下文恢复类似。  有关需要在汇编函数调用中保护哪些寄存器的详细信息、请参阅 C 编译器用户指南的第7.2节。

    此致、

    Richard

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

    感谢您的明确回答。 您能不能帮助我了解为什么堆栈需要在 ISR 中对齐地址?

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

    还有一个问题、SP 应该是偶数地址对齐的条件是什么? 我的意思是、我们必须在什么条件下使用 ASP 指令? 谢谢。。。

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

    在 C28x 上、对存储器的任何32位读取或写入都是字对齐的。 如果您将32位值写入奇数存储器地址、则该操作将需要两个周期。 例如、在上下文保存中、您会按顺序将多个32位寄存器压入栈、因此如果您从偶数字边界开始、效率会高得多。

    应在 ISR 中使用 ASP/NASP 组合、以确保栈对齐。 尽管编译器保持偶数字对齐、但中断是异步的、因此我们无法确定在中断发生时 SP 具有什么值。 ST1寄存器受中断时自动上下文保存的保护、因此当 ISR 结束时、SPA 位始终正确恢复。 我们不能做的是手动将 ASP/NASP 放入 C 语言可调用汇编函数中、因为您发现 SPA 值被改写。

    因此、要回答您的最后一个问题、您只能在汇编语言中编写 ISR 时使用 ASP/NASP。

    此致、

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

    您好 Richard、

    我很清楚。 感谢您的大力支持。

    此致、

    插孔