当断点设置时,薛定谔虫就会消失

前端之家收集整理的这篇文章主要介绍了当断点设置时,薛定谔虫就会消失前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的代码中有一个奇怪的错误,当我尝试调试时会消失.

在我的计时器中断(总是运行系统自动收报机)我有这样的事情:

if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }

在我的主循环中我有

if (some_global_flag)
 {
     some_global_flag = 0;
     do_something_very_important();   // breakpoint 1
 }

当计时器中的条件(我认为)满足时,主循环中的这种情况永远不会被调用.条件是外部的(portpins,ADC结果等).
首先,我在位置1处放置一个断点,它永远不会被触发.

为了检查它,我把断点nr. 2在some_global_flag = 1;行上,并且在这种情况下代码有效:当条件为真时触发两个断点.

更新1:

要研究是否有一些时间条件是负责的,如果在没有调试的情况下运行,则永远不会输入定时器中的if,我在我的定时器中添加了以下内容

if (a && lot && of && conditions)
 {
     some_global_flag = 1;                   // breakpoint 2
 }


 if (some_global_flag)
 {
     #asm("NOP");    // breakpoint 3
 }

该标志不会在代码中的任何其他位置使用.它在RAM中,RAM在开始时清零.

现在,当所有断点都被禁用时(或者只启用了main中的断点1),代码无法正常工作,则不执行该功能.但是,如果我只在NOP上启用断点3,则代码可以正常工作!断点被触发,继续后,执行该功能. (它有可见和可听的输出,所以它很明显,如果它运行)

更新2:

定时器中断通过其开头的“SEI”是可中断的.我删除了该行,但行为没有以任何明显的方式改变.

更新3:

我没有使用任何外部存储器.
因为我非常接近flash中的限制,所以我在编译器中进行了最大化优化.

编译器(CodeVision)可以负责,还是我做错了什么?

解决方法

这可能是典型的优化/调试错误.确保some_global_flag标记为volatile.无论你喜欢什么,这都可能是一个因素…
volatile int some_global_flag

这样你就告诉编译器不要对some_global_flag的值做什么假设.您必须执行此操作,因为编译器/优化器无法看到对中断例程的任何调用,因此它假定some_global_flag始终为0(初始状态)并且从未更改过.

抱歉,误读了您已经尝试过的部分……

您可以尝试使用av​​r-gcc编译代码,看看您是否有相同的行为……

猜你在找的C&C++相关文章