Почему я не могу использовать глобальную логическую переменную, значение которой зависит от флагов прерывания?
Я пытаюсь дождаться прерывания, чтобы продолжить выполнение кода, примерно так:
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;
}