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

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

概述我的代码中有一个奇怪的错误,当我尝试调试时会消失. 在我的计时器中断(总是运行系统自动收报机)我有这样的事情: if (a && lot && of && conditions) { some_global_flag = 1; // breakpoint 2 } 在我的主循环中我有 if (some_global_flag) { som 我的代码中有一个奇怪的错误,当我尝试调试时会消失.

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

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编译代码,看看您是否有相同的行为……

总结

以上是内存溢出为你收集整理的当断点设置时,薛定谔虫就会消失全部内容,希望文章能够帮你解决当断点设置时,薛定谔虫就会消失所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存