1

我遇到了一个非常烦人的问题,现在已经花费了几个月的时间。

我在 MPLAB X 中有一个项目。当我使用行断点时,它在调试我的项目时根本不会在正确的行上中断。

我正在使用 MPLAB X v4.15

这是我有断点的地方,我什至添加了 __nop() 操作,但也尝试了没有它

这就是实际发生的情况: 调试器在非常非常错误的地方中断。 每次都会发生这种情况,无论实际断点在哪里。

无论断点在哪里,调试器都不会在正确的位置中断。

  • 如果我在某处放置断点,它总是在错误的位置中断
  • 如果我然后重新启动调试它会在相同的错误位置中断
  • 如果我更改断点位置,程序实际中断的位置会有所不同,但当我重新启动程序时,它会再次保持不变。

更多信息:

项目信息

为什么会这样?

遇到这个问题的人多吗?

我该如何解决这个问题?

编辑

可悲的是,K_Trenholm 建议的解决方案对我不起作用。我在一个函数中放置了 3 个“NOP”,但它没有按照您的建议工作。见下图:

在一个函数中插入 3 个 NOP

但我得到的是:

错误的断点

我想补充一点,我为 NOP 尝试了各种断点组合。无论我做什么,对于这种情况,程序总是在同一台 PC 上停止,如上图所示。

感谢您的回复,甚至对如何解决它有任何想法都非常有帮助。如果您有任何其他想法,如果您能分享,我将不胜感激!

4

2 回答 2

1

想到两件事:

1) 编译器优化可能会在调试时导致断点位置/值出现问题。调试时,关闭优化(如果可能,在您的示例中,您在代码大小方面似乎遇到了天花板)。

2) 断点“打滑”。见http://microchipdeveloper.com/tls0201:skid-effect#top-of-page

根据我所见,解决此问题的一种方法是在您计划放置断点的行之后放置几个 NOP 指令。这将确保任何“打滑”都不会执行更多代码。

于 2018-03-28T14:55:04.310 回答
0

发生中断的指令将始终完全执行,管道中未决的任何指令也将执行。对于单周期指令,这会增加一条指令滑行。对于多周期指令和分支,它增加了多个周期。因此,如果您想避免将调试器跳转到子例程中,则必须Nop在断点后面包含一些内容。

例子:

void main (void)
{
    int x = 0;

    x++1;                  //put Breakpoint here
    Nop();
    Nop();
    Nop();                 //Debugger will stop here
    foo(x);                //so foo() is not called
}

根据所使用的 MCU,调试器将在遇到断点时引入“打滑效应”。调试会话将在暂停前最多执行两条额外指令。

于 2018-06-07T08:06:58.163 回答