Как обрабатываются прерывания в Arduino? - PullRequest
3 голосов
/ 29 октября 2011

Я провожу мозговой штурм в приложении, в котором может быть несколько прерываний в секунду из двух разных источников (отдельных прерываний), каждый из которых запускает функцию, которая просто добавляет число к счетчику.Мне нужен мой void loop(), чтобы выполнить простой анализ с этими данными.Мне было интересно, если прерывания выполнялись асинхронно во время работы основного цикла или они остановили основной цикл в середине его обработки?

Мой основной цикл требует правильной работы функции millis(), что, как я знаю, невозможно при прерывании на ссылку Arduino , и если прерывания выполняются синхронно, яприходится смотреть на другие решения.

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

Я не уверен, что вы имеете в виду, что прерывания выполняются синхронно или асинхронно.

Когда происходит прерывание, основная программа останавливается, и процедура обработки прерываний (ISR) выполняется в режиме, когда новые прерывания не распознаются. После выхода из ISR основная программа будет продолжена там, где она была прервана.

Реальное параллельное выполнение на Arduino невозможно, потому что ATMega является одноядерным процессором и может выполнять одновременно только одно. Но он может быстро переключаться :-) Поэтому:

Мой основной цикл требует правильной работы функции millis (),

Пока вы не звоните millis() внутри ISR это нормально, потому что ваш ISR

функция, которая просто добавляет число к счету

и, следовательно, очень быстро. Это не будет беспокоить millis() достаточно, чтобы быть замеченным никем.

1 голос
/ 29 октября 2011

Все аппаратные внешние прерывания являются асинхронными, и это, как правило, вся идея использования прерываний. Теперь, если вы спрашиваете, как закодировать это в ваш цикл, я не окажу никакой помощи, потому что это было долгое время, так как я играл с любыми чипами ATMega или Arduino. Но посмотрите на ссылку. В частности, раздел 12 о прерываниях. Это предполагает, что вы используете Ardunio с ATMega128, что, как мне кажется, является самым новым.

Но те же концепции работают почти для всех чипов ATMega, особенно тех, которые используются в платах Arduino. В документации есть пример кода для работы тоже. Это важный документ, если вы хотите получить большую часть чипа.

Документация ATMega 168

...