Задача для начинающих: коварная ошибка

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Green пишет:

andriano пишет:

Вот только НИКАКОЙ код не может гарантировать обработку всех сигналов, если последние поступают чаще, чем МК способен их обрабатывать.

Если поступают часто и много). При двойном прерывании и в случае возникновения второго прерывания в критический момент, это прерывание не будет потеряно при cli()/sei(). Только применительно к кнопке вся эта возня и нафиг не нужна.)

Да?

И сколько прерываний контроллер способен запомнить? Не будет ли потеряяны 3-4 4-е и 5-е, пока обрабатывается первое? Да и какая разница, пусть хоть 100500, если прерывания поступают чаще, чем контроллер способен их обрабатывать, это все равно проблему не решит.

И, кстати, почему Вы решили, что приведенная прека приведет к потере прерывания в "нормальном" случае? (под "ненормальным" подразумеваем случай, когда контролллер банально не успеват) Факт прерывания будет обнаружен на следующем проходе.

Green
Offline
Зарегистрирован: 01.10.2015

andriano пишет:

И сколько прерываний контроллер способен запомнить? Не будет ли потеряяны 3-4 4-е и 5-е, пока обрабатывается первое? Да и какая разница, пусть хоть 100500, если прерывания поступают чаще, чем контроллер способен их обрабатывать, это все равно проблему не решит.

Естетственно будет потеряно. Речь только о 2-м.

andriano пишет:

И, кстати, почему Вы решили, что приведенная прека приведет к потере прерывания в "нормальном" случае? (под "ненормальным" подразумеваем случай, когда контролллер банально не успеват) Факт прерывания будет обнаружен на следующем проходе.

Потому что

static bool isPressed(void) {           
   if(result = buttonState)             //забираем результат прерывания
     // если в этот момент возникнет следующее прерывание, то его результат будет обнулен ниже
     buttonState = false;
   return result;
}

В случае же запрета прерывания мы получаем его буферизацию на 1 уровень - флаг прерывавания взведётся, но его обработка начнётся только после разрешения прерывания.