我的代码中有一个奇怪的错误,当我尝试调试它时它消失了。
在我的定时器中断(总是运行系统代码)中,我有这样的事情:
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
}
当计时器中的条件(我认为)满足时,永远不会调用主循环中的这个条件。条件是外部的(端口引脚、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:
我没有使用任何外部存储器。由于我非常接近闪存中的限制,因此我在编译器中进行了最大尺寸优化。
编译器(CodeVision)可以负责吗,还是我做错了什么?