В моем коде странная ошибка, которая исчезает, когда я пытаюсь ее отладить.
В моем прерывании по таймеру (всегда работает системный тикер) у меня есть что-то вроде этого:
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
}
Это условие в основном цикле никогда не вызывается, когда условия в таймере (я думаю) выполнены. Условия внешние (порты, результаты АЦП и т. Д.).
Сначала я ставлю точку останова на позицию 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
}
Флаг не используется нигде в коде. Он находится в ОЗУ, и ОЗУ в начале очищается до нуля.
Теперь, когда все точки останова отключены (или включена только точка останова 1 в главном), код работает некорректно, функция не выполняется. Однако, если я включаю только точку останова 3 на NOP, код работает! Точка останова срабатывает, и после продолжения функция выполняется. (Имеет видимый и слышимый вывод, поэтому очевидно, если он работает)
Обновление 2:
Прерывание таймера было прервано с помощью «SEI» в его начале. Я удалил эту строку, но поведение не изменилось каким-либо заметным образом.
Обновление 3:
Я не использую внешнюю память.
Поскольку я очень близок к пределу во флэш-памяти, у меня максимальная оптимизация размера в компиляторе.
Может ли компилятор (CodeVision) быть ответственным или я сделал что-то очень неправильное?