Библиотека ArduinoThread и прерывания.
- Войдите на сайт для отправки комментариев
Пт, 16/03/2018 - 14:09
Приветствую.
Есть такая библиотека ArduinoThread. Как я понимаю, всё в ней делается через millis и всё удобно и работает.
Но автор рекомендует запуск контроллера в свою очередь помещать в прерывание.
А вот смысла этого я понять не могу.
Не поясните?
Спасибо.
ThreadController controller = ThreadController(); // This is the callback for the Timer void timerCallback(){ controller.run(); } void setup(){ // Add the Threads to our ThreadController controller.add(&analog2); Timer1.attachInterrupt(timerCallback).start(10000); }
А вы вообще понимаете, что эта библиотека делает? - для эмуляции многозадачности необходимо переключаться между потоками(Threads). А как это делать без прерывания?
Ну, без прерываний через millis эта эмуляция делается...
Собственно и эта библиотека без вызова её из прерываний работает.
Зачем тогда она, если можно через обработчик прерывания всё и делать?
Вот в чём был мой вопрос.
Спасибо.
Фокус с миллис не может обеспечить вызов гарантированно через определенные промежутки. Прерывание таймера делает это с гораздо большей вероятностью.
Это понятно.
Но зачем ставить в прерывание задачу, которая в свою очередь имеет свою периодичность?
Например автор в примере пишет
Значит этот thread запускаться будет через 100мс или больше.
Зачем его ещё в прерывание пихать?
Не понимаю смысла. Но смысл-то есть...
Не понимаю смысла. Но смысл-то есть...
вы бы открыли исходник библиотеки и посмотрели, как она устроена. Уверен. что большая часть вопросов отпадет.
Вы, наверно, думаете, что стоит написать в программе set_interval(100) - и этот кусок кода САМ начнет вызываться каждые 100мс?
Как это ни странно, я так не думаю.
Как это ни странно, я так не думаю.
а очень похоже.
Зачем автору библиотеки прерывания - проще разобраться, посмотрев исходник, а не задавая вопросы на форуме.
Заодно и нам расскажете - хорошо ли написана библиотека и нужны ли там прерывания или автор лох и можно обойтись без них. Я библиотеку не смотрел, но по приведенным вами кускам кода подозреваю, что вызов метода setInterval(100) с периодичностью 100мс обеспечивается как раз той частью кода, которая запускается в прерывании. А без прерывания любой delay() в пользовательском скетче разрушит всю систему "многозадачности".
Так автор библиотеки всё вроде написал:
It's a good idea, to create a Timer interrupt and call a ThreadController.run() there. That way, you don't need to worry about reading sensors and doing time-sensitive stuff on your main code (loop).
та фигню он написал. Это и не хорошая и не идея. Уже сто раз обсосан такой подход. Дерьмо оно. Не теряйте время на фигню, учите Си, машинки состояния и работу с неблокирующими функциями.
Я специально для опроса всяких даччиков TimerList написал. На github-е есть, могу ссылку дать. Тама на русском все.
та фигню он написал. Это и не хорошая и не идея. Уже сто раз обсосан такой подход. Дерьмо оно. Не теряйте время на фигню, учите Си, машинки состояния и работу с неблокирующими функциями.
Согласен! :)
Я специально для опроса всяких даччиков TimerList написал. На github-е есть, могу ссылку дать. Тама на русском все.
Буду признателен.
https://github.com/DetSimen/Arduino-
учите Си, машинки состояния и работу с неблокирующими функциями.
Машинки состояния это как я понимаю, конечные автоматы?