Юрий_СВ (08.07.2012 15:58 - 16:59, просмотров: 80) ответил Aлexин Aлeкcaндp на Проблемка с потерей флагов событий....
2 комплекта флагов. В каждом комплекте флаг изменения и флаг "используется фоновым циклом". Указатель или индекс комплекта отдельно для прерываний и для фонового обработчика. При просыпании фон смотрит на флаги изменения комплектов и при наличии изменений "занимает" один из них (при отсутствии - засыпает). С этого момента прерывание пишет только во второй. По окончании обработки очистка всех флагов комплекта (флаг использования фоном в последнюю очередь). Переход на налало цикла (проверка наличия комплекта с изменениями).
Узкий момент - если прерывание произойдет между проверкой и засыпанием.
Вводим отдельный флаг "подготовка ко сну". Устанавливаем его перед проверкой изменения в комплектах. Если изменения есть - убираем.
Если прерывание видит этот флаг - оно меняет адрес возврата в стеке - на НАЧАЛО фонового цикла.
Для Cortex M это решается ещё проще - предотвратить ненужное засыпание можно с помощью WFE (кажись, сбросом события в прерывании).