工具/软件:
我使用的是 C6000 编译器版本 8.3.12。 当中断服务例程在定义和/或声明中用“_interrupt"进行“进行限定(例如在.h 文件或函数原型中)时、由编译器(和链接器?)生成的代码 会产生奇怪的行为、即入口点处的栈指针不断减少(例如栈增长)、并最终导致代码执行崩溃。 中断是通过 while (1) 语句测试的、这是唯一启用的中断。
如果我不使用“__interrupt"限定“限定符、则不会发生问题。
您的建议是什么?
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.
工具/软件:
我使用的是 C6000 编译器版本 8.3.12。 当中断服务例程在定义和/或声明中用“_interrupt"进行“进行限定(例如在.h 文件或函数原型中)时、由编译器(和链接器?)生成的代码 会产生奇怪的行为、即入口点处的栈指针不断减少(例如栈增长)、并最终导致代码执行崩溃。 中断是通过 while (1) 语句测试的、这是唯一启用的中断。
如果我不使用“__interrupt"限定“限定符、则不会发生问题。
您的建议是什么?
对于包含中断服务例程的源文件、 请遵循 如何提交编译器测试用例一文中的说明。
谢谢。此致、
-乔治
以下是我在反汇编窗口中看到的 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 被保留。
谢谢。此致、
-乔治