我的代码中有一个奇怪的错误,当我尝试调试时会消失.
在我的计时器中断(总是运行系统自动收报机)我有这样的事情:
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)可以负责,还是我做错了什么?