потоки

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

добрый день. подскажите где потитать инфу про потоки. 

и вообже arduino может работать в нескалько потоков...

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

на каждый таймер подпрограмку поставил, вот тебе и потоки... а если ОСРВ нужна то гляньте FreeRTOS или аналогичные

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

akimov_aleks пишет:

добрый день. подскажите где потитать инфу про потоки. 

и вообже arduino может работать в нескалько потоков...

даже на персоналке потоки поддерживаются в первую очередь ОС, а потом уже возможно железом (вспомните однопоточные и одноядерные процессоры)

ардуино это не операционная система - это стаднарт к оборудованию и стандарт к набору библиотек к нему и среде програмирования

нет там потоков

но правильнее идти не от абстрактных потоков, а от конкретной задачи

в ардуине есть железные прерывания по внешним событиям и по таймеру. это можно использовать определенным образом для параллелилизма

MaksMS
Offline
Зарегистрирован: 11.03.2013

Прерывания же arduino поддерживает ,простой пример - библиотека RemoteSwitch

leshak
Offline
Зарегистрирован: 29.09.2011

В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток (запоминают его состояние, где остановили, значение локальных переменных), потом передают управление в "функцию обработчик". Во время ее выполнения - "основной поток" - стоит. После выхода из этой функции - состояние востанавливается, и управление возвращается в то место откуда мы "прервались".

Все. 

"Одновременно" - у нас небывает никогда.

Можно только "псевдо-одновременно". Когда "на глаз так кажется".

К примеру, если у нас есть две задачи независимые 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(), дописать еще что-то типа:

loop(){
.....

  if(digitalRead(BUTTON_PIN)){
    Serial.println("KEY PRESSED");
  }
}

То мы получим как-бы "два потока". Возникнет иллюзия что он одноврменно и диодом мигает, и что-то в Serial пишет, если нажали кнопку.

Но еще раз это "иллюзия" (коей, впрочем, достаточно для большинства задач). Истинной одновременности, на 8-битнике мы никода не получим.

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

leshak пишет:

В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток

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

уверен, что рещение надо выбирать от задачи.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

возьмите arduino Due, на армах неплохо ОСРВ идут :)

leshak
Offline
Зарегистрирован: 29.09.2011

axill пишет:

leshak пишет:

В аруине потоков - нет. Поток - один. Все прерывания, таймеры и проч. - это "костыли", которые по какому-то событию, останавливают основной поток

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

уверен, что рещение надо выбирать от задачи.

 В принципе "верно говорите" (дальше скорее уж из занудства): Ну разве что, все-таки, многоядерные звери уже не редкость. Да и видяхи зверские, все-таки, умеют реально паралельно задачи гнать.

А если вообще угнаться в философию, то у нас еще есть ограничение скорости света. Так что "воистину одновременно" - никак не получится. А если ну вообще заботанится, то выяснится что понятие "одновременно" - не такое уж простое как кажется. И вообще существование такого понятия (не то что достижимость) - под вопросом (особенно в микро/макро мире). Даже что такое "момент времени" - и то скользская до не могу штука. А еще где-то там маячит "принцип неопределенности" и "кот Шредингера"... вообщем, сорри, что-то "Остапа понесло" ;)

>уверен, что рещение надо выбирать от задачи.

Трудно не согласится. Тем более что там где "многозадачность возможна" - нужно очень осторожно ее юзать. Писать грамотный-потокобезопастный код - это сравни искуству. Та еще головная боль. А ловить баги в нем - гиморой с зубами. Может лет через 10-15-ть языки/инструменты для этого возникнут адекватные. А пока это бег на костылях с завязанными глазами по минному полю. В существующих языках. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Michal пишет:

возьмите arduino Due, на армах неплохо ОСРВ идут :)

В принципе - да. Как-то крепко село в голове, что "ардуино<==>8битный контроллер". И знаю что уже вышла Due, но .... вот не воспринимается она как "из этой семьи" :)