потоки
- Войдите на сайт для отправки комментариев
Вс, 02/06/2013 - 22:35
добрый день. подскажите где потитать инфу про потоки.
и вообже arduino может работать в нескалько потоков...
добрый день. подскажите где потитать инфу про потоки.
и вообже arduino может работать в нескалько потоков...
на каждый таймер подпрограмку поставил, вот тебе и потоки... а если ОСРВ нужна то гляньте FreeRTOS или аналогичные
добрый день. подскажите где потитать инфу про потоки.
и вообже arduino может работать в нескалько потоков...
даже на персоналке потоки поддерживаются в первую очередь ОС, а потом уже возможно железом (вспомните однопоточные и одноядерные процессоры)
ардуино это не операционная система - это стаднарт к оборудованию и стандарт к набору библиотек к нему и среде програмирования
нет там потоков
но правильнее идти не от абстрактных потоков, а от конкретной задачи
в ардуине есть железные прерывания по внешним событиям и по таймеру. это можно использовать определенным образом для параллелилизма
Прерывания же arduino поддерживает ,простой пример - библиотека RemoteSwitch
В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток (запоминают его состояние, где остановили, значение локальных переменных), потом передают управление в "функцию обработчик". Во время ее выполнения - "основной поток" - стоит. После выхода из этой функции - состояние востанавливается, и управление возвращается в то место откуда мы "прервались".
Все.
"Одновременно" - у нас небывает никогда.
Можно только "псевдо-одновременно". Когда "на глаз так кажется".
К примеру, если у нас есть две задачи независимые Task1 и Task2, то мы можем раздробить их на подзадачи
Task1=Task11+Task12+Task13...
Task2=Task21+Task22+Task23....
И в loop() (или по таймеру) сделать порядок выполнения задачь, не линейным, а по очереди: Task11,Task21,Task12,Task22,Task13,Task23...
Если время выполнения этих "кусочков задач" будет маленькое (и уж конечно, внутри них не будет каких-то delay(), pulseIn и т.п.) - то внешне это будет выглядить как-будто Task1 и Task2 выполняются одновременно.
Можно вот это "управление задачами" либо самму руками делать, либо, как посоветовал Mechael смотреть на готовое решение FreeRtos и т.п. (но все равно, они будут работать по тому же приципу). Работать она будет по тому же принципу, но за универсальность прийдется платить (местом и т.п.)
В качестве "простейшиго примера", можете посмотреть базовый Мигаем светодиодом без delay()
Если ему в конец Loop(), дописать еще что-то типа:
То мы получим как-бы "два потока". Возникнет иллюзия что он одноврменно и диодом мигает, и что-то в Serial пишет, если нажали кнопку.
Но еще раз это "иллюзия" (коей, впрочем, достаточно для большинства задач). Истинной одновременности, на 8-битнике мы никода не получим.
В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток
на компьютерах тоже "костыли", просто современный компьютер умеет очень эффективно переключаться между потоками и имеет частичную поддержку пареллелизьма в железе (в виде поддержки быстрого переключения контекста, механизмов защиты памяти, ядра, потоки внутри ядер и т.д.)
уверен, что рещение надо выбирать от задачи.
возьмите arduino Due, на армах неплохо ОСРВ идут :)
В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток
на компьютерах тоже "костыли", просто современный компьютер умеет очень эффективно переключаться между потоками и имеет частичную поддержку пареллелизьма в железе (в виде поддержки быстрого переключения контекста, механизмов защиты памяти, ядра, потоки внутри ядер и т.д.)
уверен, что рещение надо выбирать от задачи.
В принципе "верно говорите" (дальше скорее уж из занудства): Ну разве что, все-таки, многоядерные звери уже не редкость. Да и видяхи зверские, все-таки, умеют реально паралельно задачи гнать.
А если вообще угнаться в философию, то у нас еще есть ограничение скорости света. Так что "воистину одновременно" - никак не получится. А если ну вообще заботанится, то выяснится что понятие "одновременно" - не такое уж простое как кажется. И вообще существование такого понятия (не то что достижимость) - под вопросом (особенно в микро/макро мире). Даже что такое "момент времени" - и то скользская до не могу штука. А еще где-то там маячит "принцип неопределенности" и "кот Шредингера"... вообщем, сорри, что-то "Остапа понесло" ;)
>уверен, что рещение надо выбирать от задачи.
Трудно не согласится. Тем более что там где "многозадачность возможна" - нужно очень осторожно ее юзать. Писать грамотный-потокобезопастный код - это сравни искуству. Та еще головная боль. А ловить баги в нем - гиморой с зубами. Может лет через 10-15-ть языки/инструменты для этого возникнут адекватные. А пока это бег на костылях с завязанными глазами по минному полю. В существующих языках.
возьмите arduino Due, на армах неплохо ОСРВ идут :)
В принципе - да. Как-то крепко село в голове, что "ардуино<==>8битный контроллер". И знаю что уже вышла Due, но .... вот не воспринимается она как "из этой семьи" :)