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.

[参考译文] TMS320C6748:C6000 编译器为中断服务例程生成不正确的代码?

Guru**** 2417640 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1530439/tms320c6748-c6000-compiler-generates-incorrect-code-for-interrupt-service-routine

部件号:TMS320C6748

工具/软件:

我使用的是 C6000 编译器版本 8.3.12。  当中断服务例程在定义和/或声明中用“_interrupt"进行“进行限定(例如在.h 文件或函数原型中)时、由编译器(和链接器?)生成的代码 会产生奇怪的行为、即入口点处的栈指针不断减少(例如栈增长)、并最终导致代码执行崩溃。  中断是通过 while (1) 语句测试的、这是唯一启用的中断。

如果我不使用“__interrupt"限定“限定符、则不会发生问题。

您的建议是什么?

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

    对于包含中断服务例程的源文件、 请遵循 如何提交编译器测试用例一文中的说明

    谢谢。此致、

    -乔治

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

    感谢您的测试用例。  我将其构建为汇编代码。  当我检查装配体时、我看到的是函数 __interrupt 合格的起始点是...

               ADDK    .S2     -232,SP 

    和接近尾声有...

               ADDAW   .D2     SP,58,SP 

    这些指令会保留 SP 的值。  运行代码时、您看到这些指令是否执行?

    谢谢。此致、

    -乔治

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

    以下是我在反汇编窗口中看到的 ISR:

    214 _interrupt void SPIIsr (void){
    SPIIsr ():
    00813da0:07FF8C52 ADDK.S2 –232、SP
    00813da4:003E03C6 STDW.D2T2 B1:B0、*+SP[16]
    00813da8:01003AFE STW.D2T2 B2、*+ B15[58]
    00813dac:078039FC STW.D2T1 FP、*+B15[57]
    00813db0:018038FE STW.D2T2 B3、*+B15[56]
    00813db4:0F3F63C6 STDW.D2T2 B31:B30、*+SP[27]
    00813db8:0E3F43C6 STDW.D2T2 B29:B28、*+SP[26]
    00813dbc:0D3F23C6 STDW.D2T2 B27:B26、*+SP[25]
    00813dc0:0C3F03C6 STDW.D2T2 B25:B24、*+SP[24]
    00813dc4:0B3EE3C6 STDW.D2T2 B23:B22、*+SP[23]
    00813dc8:0A3EC3C6 STDW.D2T2 B21:B20、*+SP[22]
    00813dcc:093EA3C6 STDW.D2T2 B19:B18、*+SP[21]
    00813dd0:083E83C6 STDW.D2T2 B17:B16、*+SP[20]
    00813dd4:043E63C6 STDW.D2T2 B9:B8、*+SP[19]
    00813dd8:033E43C6 STDW.D2T2 B7:B6、*+SP[18]
    00813dc: 023E23C23 6 STDW.D2T2 B5:B4、*+SP[17]
    00813de0:0F3DE3C4 STDW.D2T1 A31:A30、*+SP[15]
    00813de4:0E3DC3C4 STDW.D2T1 A29:A28、*+SP[14]
    00813de8:0D3DA3C4 STDW.D2T1 A27:A26、*+SP[13]
    00813dec:0C3D83C4 STDW.D2T1 A25:A24、*+SP[12]
    00813df0:0B3D63C4 STDW.D2T1 A23:A22、*+SP[11]
    00813df4:0A3D43C4 STDW.D2T1 A21:A20、*+SP[10]
    00813df8:093D23C4 STDW.D2T1 A19:A18、*+SP[9]
    00813dfc:083D03C4 STDW.D2T1 A17:A16、*+SP[8]
    00813e00:043CE3C4 STDW.D2T1 A9:A8、*+SP[7]
    00813e04:033CC3C4 STDW.D2T1 A7:A6、*+ SP[6]
    00813e08:023CA3C4 STDW.D2T1 A5:A4、*+SP[5]
    00813e0c:013C83C4 STDW.D2T1 A3:A2、*+SP[4]
    00813e10:003403E3 MVC.S2 ILC、B0
    00813e14:003C63C4 || STDW.D2T1 A1:A0、*+SP[3]
    00813e18:003CA2F7 STW.D2T2 B0、*+SP[5]
    00813e1c:003803E2 || MVC.S2 RILC、B0
    00813e20:006C03E3 MVC.S2 ITSR、B0
    00813e24:9C85 || STW.D2T2 B0、* B15[4]
    00813e26:FC05 STW.D2T2 B0、* B15[3]
    218 dspintcREG = SOC_INTC_0_REGS + DSPINTC_EVTCLR ((SYS_INT_SPI1_INT >> 5));
    00813e28:0200222A MVK.S2 0x0044、B4
    00813e2c:0200C06A MVKH.S2 0x1800000、B4
    00813e30:BC45 STW.D2T2 B4、* B15[1]
    219 HWREG (dspintcREG)= DSPINTC_EVTCLR_EC (SYS_INT_SPI1_INT);
    00813e32:BC4D LDW.D2T2 *B15[1]、B4
    00813e34:01840028 MVK.S1 0x0800、A3
    00813e38:4C6E NOP 3
    00813e3a:0035 STW.D2T1 A3、* B4[0]
    00813e3c:EA400000 .fphead n、l、W、BU、Or、 Nosat、1010010
    221 uint32 temp =*SPIBUF_1;//清除 rxbuf full 标志
    00813e40:0270202A MVK.S2 0xfffffe040、B4
    00813e44:0200F86A MVKH.S2 0x1f00000、B4
    00813e48:104D LDW.D2T2 *B4[0]、B4
    00813e4a:DC45 STW.D2T2 B4、* B15[2]
    222 SPI1ControlCS (RFIN、HIGH、0、0);//将 CS 置为无效
    00813e4c:2627 MVK.L2 1、B4
    00813e4e:0727 MVK.L2 0、B6
    00813e50:0726 MVK.L1 0、A6
    00813e52:924E || MV.S1X B4、A4
    00813e54:1FFC6312 || CALLP.S2 SPI1ControlCS (PC-7400 = 0x00812158)、B3
    224 SPI1_ReadAD7476 (RFIN、RXINTENA、0);
    $C$RL74:
    00813e58:2627 MVK.L2 1、B4
    00813e5a:0726 MVK.L1 0、A6
    00813e5c:eb900300 .fphead p、l、W、BU、Or、 Nosat、1011100
    00813e60:1FF5B413 CallP.S2 SPI1_ReadAD7476 (PC-21088 = 0x0080ec00)、B3
    00813e64:9246 || MV.L1x B4、A4
    226 }
    $C$RL76:
    00813e66:BC8D LDW.D2T2 *B15[5]、B0
    00813e68:078039EC LDW.D2T1 *+ B15[57]、FP
    00813e6c:01003EE LDW.D2T2 *+ B15[58]、B2
    00813e70:018038EE LDW.D2T2 *+B15[56]、B3
    00813e74:0F3F63E6 LDDW.D2T2 *+SP[27]、B31:B30
    00813e78:0E3F43E6 LDDW.D2T2 *+SP[26]、B29:B28
    00813e7c:E0400000 .fphead n、l、W、BU、Or、 nosat、0000010
    00813e80:0D3F23E6 LDDW.D2T2 *+SP[25]、B27:B26
    00813e84:0C3F03E6 LDDW.D2T2 *+SP[24]、B25:B24
    00813e88:0B3EE3E6 LDDW.D2T2 *+SP[23]、B23:B22
    00813e8c:0A3EC3E6 LDDW.D2T2 *+SP[22]、B21:B20
    00813e90:093EA3E6 LDDW.D2T2 *+SP[21]、B19:B18
    00813e94:083E83E6 LDDW.D2T2 *+SP[20]、B17:B16
    00813e98:043E63E6 LDDW.D2T2 *+SP[19]、B9:B8
    00813e9c:033E43E6 LDDW.D2T2 *+SP[18]、B7:B6
    00813eA0:023E23E6 LDDW.D2T2 *+SP[17]、B5:B4
    00813ea4:0F3DE3E4 LDDW.D2T1 *+SP[15]、A31:A30
    00813ea8:0E3DC3E4 LDDW.D2T1 *+SP[14]、A29:A28
    00813eac:0D3DA3E4 LDDW.D2T1 *+SP[13]、A27:A26
    00813eb0:0C3D83E4 LDDW.D2T1 *+SP[12]、A25:A24
    00813eb4:0B3D63E4 LDDW.D2T1 *+SP[11]、A23:A22
    00813eb8:D86F MVC.S2 B0、ILC
    00813eba:9C8D || LDW.D2T2 *B15[4]、B0
    00813ebc:E8001000 .fphead n、l、W、BU、Or、 Nosat、1000000
    00813ec0:0A3D43E4 LDDW.D2T1 *+SP[10]、A21:A20
    00813ec4:093D23E4 LDDW.D2T1 *+SP[9]、A19:A18
    00813ec8:083D03E4 LDDW.D2T1 *+SP[8]、A17:A16
    00813ecc:043CE3E4 LDDW.D2T1 *+SP[7]、A9:A8
    00813ed0:070003A3 MVC.S2 B0、RILC
    00813ed4:003C62E6 || LDW.D2T2 *+SP[3]、B0
    00813ed8:033CC3E4 LDDW.D2T1 *+SP[6]、A7:A6
    00813edc:023CA3E4 LDDW.D2T1 *+SP[5]、A5:A4
    00813EE0:013C83E4 LDDW.D2T1 *+SP[4]、A3:A2
    00813EE4:001800E3 B.S2 IRP
    00813EE8:003C63E4 || LDDW.D2T1 *+SP[3]、A1:A0
    00813eec:0D8003A3 MVC.S2 B0、ITSR
    00813ef0:003E03E6 || LDDW.D2T2 *+SP[16]、B1:B0
    00813ef4:17803AFE ADDAW.D2 B15,58、SP
    00813ef8:00004000 NOP 3
    00813efc:00000000 NOP

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

    这些说明...

    00813da0:07FF8C52 ADDK.S2 –232、SP
    00813ef4:17803AFE ADDAW.D2 B15、58、SP

    ...匹配我显示的。  它们在拆卸过程中看起来略有不同。  但它们是相同的。  注意、B15 和 SP 是同一寄存器的不同名称。  这些指令是否会执行?  请确认在第二条指令完成(包括任何流水线效应)后、SP 被保留。

    谢谢。此致、

    -乔治

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

    是、两条指令均执行。

    是的、在执行第二条指令后、SP 将恢复并与进入 ISR 时的值匹配。

    但是、在后续 ISR 条目中、即使从“while (1);“调用 ISR、SP 值也与前面的条目不同

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

    SP 值会减小、最终堆栈空间会被耗尽。

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

    如果未使用“__interrupt",“,则、则 SP 在进入和退出 ISR 时为相同的值。

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

    在随后的条目和退出时也是如此。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于后续的 ISR 条目、SP 值与前面的条目不同、即使 ISR 是从“while (1);“
    调用的

    由于编译器生成的任何代码、这种情况不能发生。  由于我无法帮您调试问题、因此我将此主题的职责更改为器件专家。

    谢谢。此致、

    -乔治