在我的计时器中断(总是运行系统自动收报机)我有这样的事情:
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(初始状态)并且从未更改过.
抱歉,误读了您已经尝试过的部分……
您可以尝试使用avr-gcc编译代码,看看您是否有相同的行为……
总结以上是内存溢出为你收集整理的当断点设置时,薛定谔虫就会消失全部内容,希望文章能够帮你解决当断点设置时,薛定谔虫就会消失所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)