Почему я не могу использовать глобальную логическую переменную, значение которой зависит от флагов прерывания?

Я пытаюсь дождаться прерывания, чтобы продолжить выполнение кода, примерно так:

      bool flag = false;

void interrupt_handler (uintptr_t context)
{
    flag = true;
}

void main()
{
    CallbackRegister(event, interrupt_handler,0);
    while(!flag);
}

Но он всегда остается в цикле while, даже когда происходит прерывание. Кто-нибудь знает, почему? В настоящее время я использую MPLABX с микроконтроллером SAMD21J17.

2 ответа

Вам нужно изменить:

      bool flag = false;

к:

      volatile bool flag = false;

Причина в том, что без volatileкомпилятору разрешено предполагать, что флаг никогда не меняется после того, как он был прочитан один раз, но вы хотите, чтобы он читал этот флаг неоднократно.

Хм. Я не знаю этого конкретного компилятора, но беглый просмотр руководства пользователя компилятора микрочипа говорит о том, что сразу бросается в глаза.

У вас есть функция с именем обработчик прерываний, но она не идентифицирована с помощью декоратора. Я предлагаю вам посмотреть это руководство в разделе 5.8.1 «Написание процедуры обслуживания прерываний», где говорится: «Напишите каждый прототип ISR, используя спецификатор __interrupt()».

Таким образом, ваша рутина будет выглядеть как минимум так:

      void __interrupt(high_priority) interrupt_handler (uintptr_t context) {
    flag = true;
}
Другие вопросы по тегам