1) как объявлены c_flag и g_flag? 2) для полной красоты не хватает __DSB() в конце каждого обработчика прерывания 3) Если одно из прерываний произойдет с момента выхода из другого до сброса c_flag, g_flag в основном цикле - оно просто сбросит свой флаг и основной цикл его не заметит, потеряет. 4) прерывания имеют разный приоритет, значит прерывание EXTI0 может сработать внутри обработчика EXTI2 и случится полная каша. 5) в железе PB9, 10, 11 подключены к другим входам EXTI и влиять не должны никак.
Полагаю, что причина в п. 1. Могу предположить, что вы объявили их без квалификатора volatile и тогда добавление кода махания ногами PB9...11, из-за использования вызовов функций SPL, заставляет компилятор вычитывать c_flag и g_flag из памяти в начале каждой итерации цикла. Без кода махания ногами компилятор из-за отсутствия volatile оставляет их закешированными в регистрах и изменение обработчиками их копий в памяти на значения в регистрах не влияет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|