что нельзя выполнять внутри прерывания?

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Где-то была тема не могу  ее найти, что нельзя выполнять внутри прерывания ?

millis()

micros()

delay()

вывод иформации в com-port

чтение информации из  com-port ?

 

msg31
Offline
Зарегистрирован: 01.12.2013

KamovEugeniy пишет:

Где-то была тема не могу  ее найти, что нельзя выполнять внутри прерывания ?

millis()

micros()

delay()

вывод иформации в com-port

чтение информации из  com-port ?

 

com-порт нельзя точно.

delay без фанатизма.

millis(), micros() можно.

 

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

msg31 пишет:

KamovEugeniy пишет:

Где-то была тема не могу  ее найти, что нельзя выполнять внутри прерывания ?

millis()

micros()

delay()

вывод иформации в com-port

чтение информации из  com-port ?

com-порт нельзя точно.

delay без фанатизма.

millis(), micros() можно.

 
 
Generally, an ISR should be as short and fast as possible. If your sketch uses multiple ISRs, only one can run at a time, other interrupts will be ignored (turned off) until the current one is finished. as delay() and millis() both rely on interrupts, they will not work while an ISR is running. delayMicroseconds(), which does not rely on interrupts, will work as expected.
axill
Offline
Зарегистрирован: 05.09.2011

Garry пишет:

other interrupts will be ignored (turned off) until the current one is finished

ошибочное утверждение. Вызов других прерываний действительно будет запрещен если внутрир прерывания их принудительно не разрешить, но прерываания не будут проигнорированы. МК взведет флаги в регистрах и как только будет можно вызовет нужное прерывание

mllis() можно вызывать но надо понимать, что сколько бы раз его не вызывать внутри одного цикла прерывания ты всегда получишь одно и тоже значение времени

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

axill пишет:

Garry пишет:

other interrupts will be ignored (turned off) until the current one is finished

ошибочное утверждение. Вызов других прерываний действительно будет запрещен если внутрир прерывания их принудительно не разрешить, но прерываания не будут проигнорированы. МК взведет флаги в регистрах и как только будет можно вызовет нужное прерывание

mllis() можно вызывать но надо понимать, что сколько бы раз его не вызывать внутри одного цикла прерывания ты всегда получишь одно и тоже значение времени

мне нужно вызывать micros(), его первый вызов внутри прерывания даст корректный результат ?

axill
Offline
Зарегистрирован: 05.09.2011

KamovEugeniy пишет:

мне нужно вызывать micros(), его первый вызов внутри прерывания даст корректный результат ?

сам не проверял, но не вижу причин чтобы это не сработало правильно, проверьте

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а у меня Serial.print работает во время прерывания (выплевывает показания как и обычно). Почему?

axill
Offline
Зарегистрирован: 05.09.2011

Tomasina пишет:

а у меня Serial.print работает во время прерывания (выплевывает показания как и обычно). Почему?

почему бы ему не работать? просто все эти операции медленные, они внутри прерываний будут приводить к пропуску прерываний. В МК есть флаги и если доспутим во время одного прерывания случились условия для срабатывания другого - оно встанет в очередь и тут как бы нет проблем

но если одно прерывание выполняется так долго, что за это время условия для других прерываний сработали несколько раз - эти срабатывания будут пропущены

у вас напрмер могут начать не верно ходить часы millis() из-за пропуска прерываний от таймера