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.
工具/软件:TI C/C++编译器
您好!
客户正在使用 C2000计时器来运行 uCOS。
在 ISR 中、一些代码位于 asm 中。 他们发现、如果 st0和 st1不是手动 POP 和 PUSH、代码就无法正常运行。
其他 CPU 寄存器不需要进行 POP 和手动推入。
_interrupt 关键字用于 ISR。
问题可能出在哪里?
非常感谢。
BR、Jordan
在 C28x 器件上、当一个中断发生时、几个寄存器被自动保存在堆栈上。 这些寄存器中有 ST0和 ST1。 这些寄存器由指令 IRET 恢复。 编译器使用 IRET 从中断返回。 请在 C28x CPU 手册中搜索 IRET。
因此、无需手动保留 ST0和 ST1。
谢谢、此致、
乔治
乔治
在 dis 中、我们找到了 IRET。
BR、Jordan
[引用 user="Jordan Zhou "]在 ds-asm 中、我们找到了 IRET。
这正是我所期望的。 请解释为什么这很重要。
谢谢、此致、
乔治
以下是代码:
OSTickISR:
0925d3:761B ASP
141按 Rb
0925d4:FFF0按 RB
142 MOV32 *SP++,STF
0925d5:E20000BD MOV32 * SP++,STF
143 MOV32 *SP++,R7H
0925d7:E20307BD MOV32 * SP++,R7H
144 MOV32 * SP++、R6H
0925d9:E20306BD MOV32 * SP++,R6H
145 MOV32 *SP++,R5H
0925db:E20305BD MOV32 *SP++,R5H
146 MOV32 * SP++,R4H
0925dd:E20304BD MOV32 *SP++,R4H
147 MOV32 * SP++,R3H
0925df:E20303BD MOV32 * SP++,R3H
148 MOV32 * SP++,R2H
0925e1:E20302BD MOV32 * SP++、R2H
149 MOV32 * SP++,R1H
0925e3:E20301BD MOV32 * SP++,R1H
150 MOV32 *SP++,R0H
0925e5:E20300BD MOV32 * SP++,R0H
152按 DP:ST1
0925e7:7609按 DP:ST1
153按 AR1H:AR0H
0925e8:0005按 AR1H:AR0H
154按下 XAR2
0925e9:AABD MOVL *SP++,XAR2
155按 XAR3
0925ea:A2BD MOVL *SP++,XAR3
156按 XAR4
0925eb:A8BD MOVL *SP++,XAR4
157按 XAR5
0925ec:A0BD MOVL *SP++,XAR5
158按 XAR6
0925年版:C2BD MOVL *SP++,XAR6
159按 XAR7
0925ee:C3BD MOVL *SP++,XAR7
160按 XT
0925ef:ABBD MOVL *SP++,XT
161推送 RPC
0925f0:0004推送 RPC
163 LCR _OSTimerTick
0925F1:76492B91 LCR OSTimerTick
168 LCR _OSIntExit
0925f3:764929A6 LCR OSIntExit
170 POP RPC
0925f5:0007 POP RPC
171 POP XT
0925f6:87BE MOVL XT、*- SP
172 POP XAR7
0925f7:C5BE MOVL XAR7、*- SP
173 POP XAR6
0925f8:C4BE MOVL XAR6、*- SP
174 POP XAR5
0925f9:83BE MOVL XAR5、*- SP
175 POP XAR4.
0925fa:8ABE MOVL XAR4、*--SP
176 POP XAR3
0925fb:82BE MOVL XAR3、*- SP
177 POP XAR2
0925fc:86BE MOVL XAR2、*--SP
178 POP AR1H:AR0H
0925fd:0003 POP AR1H:AR0H
179 POP DP:ST1
0925fe:7601 POP DP:ST1
181 MOV32 R0H、*--SP
0925ff:E2A00BE MOV32 R0H、*- SP、UNCF
182 MOV32 R1H、*--SP
092601:E2A01BE MOV32 R1H、*- SP、UNCF
183 MOV32 R2H、*--SP
092603:E2A02BE MOV32 R2H、*- SP、UNCF
184 MOV32 R3H、*--SP
092605:E2A03BE MOV32 R3H、*- SP、UNCF
185 MOV32 R4H、*--SP
092607:E2A04BE MOV32 R4H、*- SP、UNCF
186 MOV32 R5H、*--SP
092609:E2A05BE MOV32 R5H、*- SP、UNCF
187 MOV32 R6H、*--SP
09260b:E2A06BE MOV32 R6H、*- SP、UNCF
188 MOV32 R7H、*--SP
09260d:E2AFE07BE MOV32 R7H、*- SP、UNCF
189 MOV32 STF、*- SP
09260f:E28000BE MOV32 STF、*- SP
190持久性有机污染物 RB
092611:FFF1 POP RB
192个 NASP
092612:7617 NASP
193 IRET
092613:7602 IRET
我认为中断服务例程是在 C 代码中实现的。 您显示的代码似乎来自手动编码的汇编、并且不是由编译器生成的。 是这样吗?
如果它是由编译器生成的、那么我需要一个测试用例、允许我重现此行为。 对于该源文件、请按照文章 如何提交编译器测试用例中的说明进行操作。
谢谢、此致、
乔治
乔治
你是对的。 编译器不会生成代码。
客户无法提供测试用例。
BR、Jordan
约旦
乔治是正确的。 ST0和 ST1自动是上下文保存/恢复的一部分。 http://www.ti.com/lit/spru430中对此进行了说明
客户将需要单步执行代码并进行一些调试、然后确定问题所在。
此致
Lori
约旦、您好!
我已经听过几天了, 希望这有助于回答您的问题,或者您能够解决问题。
如果问题已解决、请单击绿色的"验证答案"按钮。
如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
此致、
Lori