当按下 'step out' 时,Atmel Studio 中的调试会跳转到代码的空白区域

Debug in Atmel Studio jumps to wild area of code when 'step out' is pressed

大家好!

我是 运行 带有所有补丁的最新 Atmel Studio 7。 AVR-GCC 通过 JTAG 与 32U4 avr 和 Atmel-ICE 一起使用。

我在一个 ISR 函数中,每次我按 step over 都工作正常,直到我调用一个单独的函数。 当我到达这个函数时,我在第一行代码上。 下一次按 step over 并没有像它应该的那样转到下一行,而是随机跳回到我的 ISR 函数的中间。

该代码无法正常工作,但在最后几处更改之前可以正常工作。

我该如何解决这个问题?

谢谢!

我首先让构建生成汇编列表文件 (-Wa,adhlns),然后反汇编最终二进制文件 (avr-objdump -h -S)。这让我有可能检查实际生成的代码,并在我更改 C 源代码并重新构建时继续观察生成代码的变化。 (我不知道如何使用 Atmel studio 实际执行此操作,我只有基于 make 和 avr-gcc 的构建系统的经验。)

然后我可以检查有哪些编译器优化选项(-O2-O1-O3-Os 或 ...),以及如何选择优化级别分布了不同C语句的汇编指令。 AFAICT,在 AVR 上,优化大小 (-Os) 自动使代码变快(每条指令在 AVR 上花费相同的时间,因此指令越少,代码越小,执行速度越快),并且数量指令改组非常有限,因此很容易阅读。

当你调试 ISR 时不要忘记断点 cpu 将停止,但所有 I/Os 继续 运行,你可能会触发一个新的中断当您按下下一站时,可能会触发其他断点,并且调试器会在另一个地方停止。

您是否在最终 RETI 之前启用中断?

原来我已经将优化设置为 -o3 然后 -os

当我设置回默认值 -o1 时...一切正常。

我猜 AVR-gcc 无法处理它?