コードに奇妙なバグがあり、デバッグしようとすると消えてしまいます。
私のタイマー割り込み(常にシステムティッカーを実行している)には、次のようなものがあります:
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は最初にゼロにクリアされます。
現在、すべてのブレークポイントが無効になっている場合(または、メインのブレークポイント1のみが有効になっている場合)、コードは正しく機能せず、関数は実行されません。ただし、NOPでブレークポイント3のみを有効にすると、コードは機能します。ブレークポイントがトリガーされ、続行した後、関数が実行されます。(それは目に見える出力と聞こえる出力を持っているので、それが実行されるかどうかは明らかです)
アップデート2:
タイマー割り込みは、最初の「SEI」によって割り込み可能でした。その行を削除しましたが、動作は目立った方法で変更されていません。
アップデート3:
外部メモリを使用していません。フラッシュの制限に非常に近いので、コンパイラで最大でサイズを最適化します。
コンパイラ(CodeVision)が責任を負うことができますか、それとも私は何か非常に間違ったことをしましたか?