Вопрос про многопоточность (МП)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну тогда и меня записывай в разработчики осей .. диспетчер задач - подпрограмма которая сохраняет текущий контекст в заданное место и восстанавливает его из заданного места, тем самым переключая исполнение .. впервые писан ещё под КР580ИК01 .. даже не помню в каком году.. с тех пор, есть цельная библиотека на "С", по принципу ADA-задачного механизму с семействами задач, входами и т.д. и даже семафоры там не нужны ни разу.. только это не ОСь (по секрету), далеко не ось.. так, мелочь. :)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Чем зря трендеть, код в студию.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

-NMi- пишет:

Нужно просто включить ГОЛОВУ и отойти от концепции "скетчей" и написать всё самому ... да хоть на... С(++) и тгда будет счЯсЬе  )))

)))  могу дать "скетч" мигания 12-ю светодиодами с ШИМ-модуляцией+дисплей+джойстик,правда почти весь на ASM     )))


мне дайте пожалуйста

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

triac пишет:
Чем зря трендеть, код в студию.

Э-э-э, простите, код .. чего? Диспетчера задач для 580ИК01? Сложновато .. мой 5-и дюймовый дисковод как-то давно заржавел, да и дискетка уж не помню где валяется .. на помойке. :)

Код диспетчера для AVR? Так их полно, бери любой .. хотя бы ту библиотеку что указана выше. setjump, longjump в помощь. Можешь взять код таймерного хука для millis() из опубликованного мною раньше. Он даже умеет блокировать повторный вызов и не блокирует время..

Уточните свое желание плиз..

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Чем зря трендеть, код в студию.

Размештались! Тут 80% теоретиков, знают как  писать код, учат других, но сами пишут только сообщения на форум ))  К ахату это не относится, он таки могет. 

По вопросу. Таки да кооперативная верно, вытесняющая для 328 и им подобных - просто забыть. Но кооперативная имеет врожденный недостаток - пока один поток не кончит, другой не поедет. А это для реалтайма не гуд. Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скрівает от азработчика его реализацию. Увы, чудес не бывает.

ТС желая МП, явно не предполагал что все его потоки не реже чем раз в , допустим 1мсек, должны будут обязательно переключится (и это он явно в коде должен прописать!) и получат продолжение неизвестно когда, но не позже допустим  10мсек. Он же по комютерному мыслит - все потоки независимы;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Logik, так и для вытесняющей системы нет ничего сложного. 32 регистра + адрес стека + состояние + адрес точки входа + байтик на флаги задачи (работает, ждет и т.д. ..) = 40 байт на процесс. Плюсом 2-4 байта для фиксации текущей задачи и так, на мелочь.. setjump, longjump берешь за основу и пишешь диспетчер задач около 160 команд (300байт кода) - оценка есть выше. Вешаешь его на прерывание от таймера и собственно всё. Остальное - правильно оформить в классах, модуле, наборе процедур .. для удобства. Работы .. на день.

И гоняй свои задачи пока не посинеют.. Десяток процессов - 400 байт из 2к. для 328 меги (НАНО).

Только это - НЕ ОС. Это её малюсенький кусочек.. :)

ОС начнется тогда, когда ты захочешь использовать UART0 (Serial.print) одновременно в нескольких процессах .. и ОС(!) должна грамотно разделить доступ к периферии. А её у микроконтроллера .. как грязи. Собственно кроме периферии-то и нет ничего.

А диспетчер .. список задач можно даже во флеш запихать .. оно ни о чем.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Многопоточность - это наша реальность. То, что больше 24 кадров в секунду (в максимальном разрешении) - это наша жизнь. И как Вы собираетесь под КР580ИК01это реализовать....

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Зачем? У вас есть задача И работающий 580-й? У меня давно нет .. и что там сложного? :)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
К ахату это не относится, он таки могет.

Пока что от него ничего кроме голословного трендежа с ошибками не видел.

Logik пишет:
По вопросу. Таки да кооперативная верно, вытесняющая для 328 и им подобных - просто забыть. Но кооперативная имеет врожденный недостаток - пока один поток не кончит, другой не поедет. А это для реалтайма не гуд.

Однако даже отнюдь не бесплатная кооперативная   Salvo уже который десяток лет живет и здравствует.  Даже в космос, говорят, летает.  А все ее пользователи просто дураки такие, ага.

Logik пишет:
Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скрівает от азработчика его реализацию.

Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И не увидите. Уже давно ничего не выкладываю. Вам - все равно не зачем. :)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Ни разу не сомневался, что не увижу.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

пост №56 - практически готовый диспетчер задач. Вам лень самому написать несколько строк кода? Там все изложено на достаточно простом языке .. что-то мешает сделать самостоятельно?

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Однако даже отнюдь не бесплатная кооперативная   Salvo уже который десяток лет живет и здравствует.  Даже в космос, говорят, летает.  А все ее пользователи просто дураки такие, ага.

Ага. Без Salvo на тех же ресурсах реализовалось бы поболее. Вобще глядя на кол-во пользователей айфона я понимаю что кол-во пользователей еще не довод в споре дураки или нет ;)

 

triac пишет:

Logik пишет:
Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скривает от разрботчика его реализацию.

Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл. 

Вы не среагировали на "ставим требования к потоку отрабатывать быстро". Это основной момент. А уж как будет реализовано переключение: сервисом недо-ОС или самописным автоматом - дело вобщем десятое. Я выбираю второе т.к. и компактней и шире возможности - я себе напишу что захочу, там вобщем и писать помелочах. Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой. А когда (или если;) человек научится разбивать поток на короткие фрагменты - ему что coos, что машинка состояния уже мелочи.

Logik
Offline
Зарегистрирован: 05.08.2014

Arhat109-2 пишет:

Logik, так и для вытесняющей системы нет ничего сложного....

Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)

MizAL
Offline
Зарегистрирован: 04.04.2018

leOS в помошь) Неплохая (по мне) библиотека для довольно простой реализации многопоточности. Есть еще Arduinomultitask-master, она проще, но у меня эта библиотека почему-то не пошла(

Logik
Offline
Зарегистрирован: 05.08.2014

Та их много, а толку от них мало. Те 160 команд про которые ахат пишет любой освоивший указатели напишет. Потому и плодят хххOS.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MizAL пишет:
leOS в помошь) Неплохая (по мне) библиотека для довольно простой реализации многопоточности.

Она привязана к железу и не обеспечивает базового сервиса - задержки выполнения задачи. Насколько я понимаю, в одной задаче просигналить SOS азбукой морзе она не может.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
Вы не среагировали на "ставим требования к потоку отрабатывать быстро". Это основной момент.

На среагировал на демагогию.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А чо такое кр580ик01? 

Я только кр580вм80 знаю

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это его старая номенклатура до какого-то там года. :)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

DetSimen пишет:
А чо такое кр580ик01?

Это комбинация старческого склероза с распальцовкой.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Logik пишет:

Arhat109-2 пишет:

Logik, так и для вытесняющей системы нет ничего сложного....

Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)

Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня. Ещё можно что-то реализовать с моей расширенной до 512 килобайт SRAM .. но и тоже, как выясняется "нафиг надо"..

Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой.

Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор. И никакого отдельного стека не надо.

Вы просто не владеете предметом, о котором разглагольствуете. Судя по всему, путаете те "а-ля прототред" каракатицы, которые сами пишете, с нормальной кооперативной осью. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

triac пишет:

DetSimen пишет:
А чо такое кр580ик01?

Это комбинация старческого склероза с распальцовкой.

Пошукал, освежил память .. да, звиняюсь 580ИК01 никогда не выпускался с буквами К(Р) и в сети известен на 580ВМ1 (маркировка после 1986г: разбивка группы ИК "прочие" на ВМ и т.д.) .. и это немножко не то. Посмотреть можно тут: http://www.155la3.ru/k580.htm

Мне сейчас прикольно то, что работал с ним, и даже имея (в другой области) первую форму допуска и принимая камни непосредственно на Кристалле .. не знал о его "расширенных возможностях" .. то что он просто 5-и вольтовый и до 5Мгц - знал (поэтому и заказывали). О расширении системы команд прочитал только сейчас, по ссылке. :)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Серьёзно???

Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!

Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.

Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.

Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.

Ну шо, мне поискать?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

:) Это было в ответ кому и на что? (есть кнопка "цитировать") .. что искать, хекс .. зачем, кому он нужен? Исходники есть и на таймер0 от Ардуино и на I2C и на все остальное .. Вам - недоступны?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Там сверху просят код ШИМ-моргалки 12-ю светодиодами.  (а так я цитировать и нажимал )))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ясно. Ну .. тут на форуме все время какой-нить код просют .. попрошайки-с, как сказал бы поручик. :)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дык я рыбу всё равно не дам, а удочку - пожалуйста:)

ssss
Offline
Зарегистрирован: 01.07.2016

Arhat109-2 пишет:

Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)

Кошмарить единственный i2c... это от бедности ума... Надо брать железо по задаче... тогда и потерь будет меньше... и с синхронизацией проблем не будет... Всё остальное - садомазоколхоз...

Цитата:

Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня.

Всё железное должно быть на железе... всё софтовое - на софте... И нехрен при отсутствии вменяемого железа перекладывать всё на софт... Тогда всё будет сводиться к тривиальному распределению железа, ресурсов и задач... которые априори будут асинхронными и параллельными... Софту остаётся только это обработать всё неспеша...

Цитата:

Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?

100%... Мега здесь как деревянный топор... не для этого она предназначена... Не... можно конечно, для определённых задач, поизголяться... как tester в своё время на ПИКе и ОСА... но это уже всё будет на грани возможностей железа и перегрева мозга вкраплениями АСМовых инструкций и подсчётом тактов... что уже чревато и не каждому по плечу...

ssss
Offline
Зарегистрирован: 01.07.2016

-NMi- пишет:

Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!

Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.

Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.

Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.

Ну шо, мне поискать?

Да никому этот мусор сегодня уже не интересен... Это лет так 15 назад... может ещё быть...

Нет у вас там никакой параллельности и вытеснения априори... что сегодня уже - жуть кошмарная...

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Logik пишет:
Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой.

Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор. 

ОК, глянул я твой шедевр, именуемый "нормальной кооперативной осью". Я так понимаю ты автор но стесняешся. И не зря! По порядку. Прелесть рассматриваемого в краткости. На этом плюсы закончены. Специфика либы: построена на setjmp.h, прерывания, таймеры и управление стеком не задействованы. Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее. Странно было бы по другому в кооперативной МП, как следствие параметр x нахрен ненужен, он ничего не гарантирует. И "COOS_DELAY(x), причем столько, сколько мне их захочется" - не так, а достаточно часто, чтоб остальные потоки отработали, это и есть разбиение на короткие, быстро отрабатывающие части. Кстати о приоритетах. Ими автор не заморачивался но похоже получился циклический, что только усугубляет проблему при наличии быстрых и медленных потоков.

Но страшней другое. Игнорирование происходящего в стеке приведет к краху. Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)

На том все. Заранее предупреждаю, на нытье в стиле я все поправил, посмотрите какая класная версия, теперь все по другому и т.д. я не реагирую, если чё, ахат знает ;) я смотрю "шедевры" один раз, просто времени своего жалко.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло? :)

Logik пишет:
Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее.

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

Logik пишет:
Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)

Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).

Если же хочется использовать локальные переменные за границами COOS_DELAY(x), во всей задаче,  достаточно их объявить как static. Это некошерно, или нехаляльно, или вы просто не знаете что это такое? Если судить о вашем уровне по предыдущим комментариям, то очень вероятно, что не знаете, от этого и происходят ваши "возражения".

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло? 

Ваш шедевр тут явно ниче не сказал. А проблема не моя, а тех кто делеи пишет.

 

triac пишет:

Logik пишет:
 Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее. 

Это не специфика coos, а всем известное свойство любой кооперативной оси,

Так и нефиг писать "получит управление обратно через заданное число тиков х". Будем считать что неправоту этой фразы Вы осознали. Или нагуглили, неважно. Вопрос закрыт в общем случае, COOS_DELAY(x) ниче по времени не обеспечивает. В отличии от delay() кстати ;)

triac пишет:

Logik пишет:
 Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;) 

Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).

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

triac пишет:

   достаточно их объявить как static. Это некошерно, или нехаляльно...

Видите сам что лажаово оно )))) на том и закончим.

ПС. Да ты не психуйте так, жирный шрифт не давите, то шо лошара кривой код написал и по коду видно. В нем все сказано и без болда. Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем.

//Если судить о вашем уровне по предыдущим комментариям..

Ну даффайте судить. Так, чисто для уровнями померится из старенького http://arduino.ru/forum/proekty/akvakontroller-maksimum-iz-mini Или код чтоб решить вам для ся, определится, знаю я про статик или нет -http://arduino.ru/forum/apparatnye-voprosy/gsm-modem-a6-v-rezhime-tcp Понравится - ищи, тут много.

 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
triac пишет:
Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло?

Ваш шедевр тут явно ниче не сказал. А проблема не моя, а тех кто делеи пишет.

Это в ваших "а-ля прототред" проблема, а в coos этой проблемы нет в принципе. Пишите COOS_DELAY(x) сколько хотите. Все еще не дошло?

 

А жирный шрифт для большей понятности использую. Когда оппонент совсем тупой и не способен отличить главное от второстепенного.

Logik
Offline
Зарегистрирован: 05.08.2014

Ну и на Ваш код интересно бы глянуть. Как там у Вас 

triac пишет:

Чем зря трендеть, код в студию.

Например с использованием coos ;)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
Ну и на Ваш код интересно бы глянуть. Как там у Вас
triac пишет:

Чем зря трендеть, код в студию.

Например с использованием coos ;)

Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.

 

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Logik пишет:
Ну и на Ваш код интересно бы глянуть. Как там у Вас
triac пишет:

Чем зря трендеть, код в студию.

Например с использованием coos ;)

Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.

 

Таки автор.  a_coos.ino я смотрел. И уже отписался "Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем."

Посмотрел второй.

Вы писали.

triac пишет:

Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).

И это тоже писали.

// =================================
// Task 0 : Control RGB strip
// =================================
void coos_task0(void)
{
  static uint8_t startIndex = 0;
  run_time_cnt = 0;
  sec_cnt = (PATTERN_DURATION >> 1);
  rate = 2*LED_UPDATE_RATE;
  COOS_DELAY(1000); // power-up safety delay    
  FastLED.addLeds<LED_TYPE, RGB_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );  
  SetupRandomPalette();
  currentBlending = LINEARBLEND;
  while(1)
  {
    COOS_DELAY(rate);    
    FastLED.show();
    // ----------------------------
    // Night time
    // ----------------------------
    if (dark)
    {
      if (run_time_cnt < RUN_TIME*3600) // 
      {        
        digitalWrite(RELAY,HIGH);
        ChangePalettePeriodically();
        if (dir)
        {
          startIndex = startIndex + 1; /* motion speed */
        }
        else
        {
          if (startIndex)
            startIndex--;
          else
            startIndex = 0xFF;   
        }
        FillLEDsFromPaletteColors( startIndex);
      }
      else
      {
        LedsBlack();
        digitalWrite(RELAY,LOW);
        dark |= 2;
        COOS_DELAY(1000);
      }
    }
    // ----------------------------
    // Daytime
    // ----------------------------
    else 
    {
      if (run_time_cnt)
      {
        run_time_cnt = 0;
        LedsBlack();
      }
      digitalWrite(RELAY,LOW);
      COOS_DELAY(100);
    }
  }
}
// =================================
// Task 1: Debug
// =================================
void coos_task1(void)
{
  static uchar cnt = 0;
  while(1)
  {
    if (dark)
    {
        cnt = 0;
    }
    else
    {
      Serial.print("."); 
      if (++cnt > 15)
      {
        Serial.println();
        cnt = 0;    
      }
    }
    COOS_DELAY(1000);
  }
}
// =================================
// Task 2: Photo sensor and time
// =================================
void coos_task2(void)
{
  uint thr;
  run_time_cnt = 0;  
  while(1)
  {
    // ------------------------
    // Photo sensor
    // ------------------------
    PhotoVal = analogRead(PhotoPin);
//    Serial.print("Photo = ");
//    Serial.println(PhotoVal);
    if (dark) 
      thr = 2*PHOTO_THRESHOLD;
    else
      thr = PHOTO_THRESHOLD;
    // ------------------------
    // Grace
    // ------------------------
    if (PhotoVal < thr)
    {
      if (dark_cnt < 3*DARK_CNT_LIM)
        dark_cnt++;
    }
    else if (dark_cnt)
    {
       dark_cnt--;
    }
    if (dark_cnt >= 2*DARK_CNT_LIM)
    {
      if (dark == 0)
      {
        digitalWrite(RELAY, HIGH);
        digitalWrite(GLED, HIGH);
        COOS_DELAY(10);  
        LedsBlack();
        run_time_cnt = 0;
      }
      dark = 1;
    }
    else if (dark_cnt < DARK_CNT_LIM)
    {
      dark = 0;      
      digitalWrite(RELAY, LOW);
      digitalWrite(GLED, LOW);
    }
    // ------------------------
    // Run time
    // ------------------------
    COOS_DELAY(1000);  
    sec_cnt++;    
    if (run_time_cnt < 0xFFFF)
    {
      run_time_cnt++;
    }
  }
}   

Вы сами нарушаете свои требования. Подозреваю что на момент написания примера вы даже не подозревали о них ;)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:
Подозреваю что на момент написания примера вы даже не подозревали о них ;)

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

Logik пишет:
И уже отписался "Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем."

Для совсем уж наивных или безнадежно тупых идиотов, прямым текстом: то, что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ. А главное - зачем?

Есть у вас замечания по делу - пишите. Зачем бессмысленно копипастить куски из ппроектов выходного дня? У вас гондурас чешется?

Logik
Offline
Зарегистрирован: 05.08.2014

Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько  функцию вызываемых из разных coos_taskТам дырка на дырке.  Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ.

бедная компания с такими спецами. Я кстати тоже не с репозитория фирмы код показываю.

 

triac пишет:

Зачем бессмысленно копипастить куски из ппроектов выходного дня? 

 Ок. Будем относится к опубликованому как к дибильной шутке. Нефиг ей популяризировать. А скопипастил - для истории ;) Чтоб не открестились. Понимаю что Вам стыдно. Ну решили же - шутка. Проехали вобщем. 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:

Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько  функцию вызываемых из разных coos_taskТам дырка на дырке.  Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.

Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.  У вас, очевидно, большие  проблемы с пониманием, как работает С-шный код. Аналогичные вашим проблемам с пониманием что такое кооперативная ось и как она работает.

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе. 

Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:

triac пишет:

Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе. 

Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)

За выходные сделал, с тех пор несколько месяцев работает непрерывно. Чего еще разжевать?

Как говорится, "IQ хорош, но мог бы быть трехзначным" (с)

Logik пишет:

впишите COOS_DELAY в любые несколько  функцию вызываемых из разных coos_task.

Так ведь не вписана. И даже в комментах к сoos написано, что этого делать нельзя. Но ведь чукча не читатель, ага? Чукча фантазер и пейсатель.

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе. 

Вы напомнили мне слова коллеги, сильно престарелого програмера, который строку в делфях межу потоками передавал без попыток синхронизации. "Как так?! 100000 раз проходит, 3 дня без сбоев! а на 100001 раз строка битая! Может память поменять?" Он просто не подозревал о проблемах в многопоточных приложениях, а с кодом мы тогда натрахались по командировкам.. ))) Так и у Вас гдето...

ПС. про ленту - да есть оно и у меня,  http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812#comment-138359, и даже так, как Ві никогда и не представите  http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812?page=1#comment-327386 И пашет годами, это все простые проекты (ну за исключением ассемблерного кода который я сам писал, а вы либку подцепили). Такие штуки, как и блинк, пишутся на раз полюбому. А примера сложного, с меню, протоколами обмена и др. растянутыми по времени и быстрыми - сервы, шим, датчики. Там все сразу ясно. Хотите попробывать - поцепите к своей ленте приемник ИК и с пульта поуправлять во время непрерывных динамических эффектов на ленте. Четко два потока! Хрен сделаете! )))

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Logik пишет:

Так и у Вас гдето..

Ничего конкретного сказать не можете, продолжайте бредить.

ssss
Offline
Зарегистрирован: 01.07.2016

triac пишет:

Ничего конкретного сказать не можете

А вы всё наивно ждёте... что за вас вашу шнягу кто-то доделает???

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

ssss пишет:

triac пишет:

Ничего конкретного сказать не можете

А вы всё наивно ждёте... что за вас вашу шнягу кто-то доделает???

Вы не в теме, шняга давным-давно работает. Я наивно жду, когда кто-нибудь хоть что-нибудь дельное скажет. Конкретное, вменяемое. А вижу одни только голословные невежественные высказывания, включая ваше.

Впрочем, лукавлю. От той части местных  завсегдатаев, которые по тупости и невежеству взялись спорить с общеизвестными вещами, или от троллей вроде вас, мне не надо ничего, кроме поддержания темы на плаву. Благодаря этому не только ТС, но, может, еще кто-то из начинающих увидит coos и станет ее использовать, экономя себе кучу времени и усилий. Так что "не пропадет ваш скорбный труд" (с), хе-хе.

Logik
Offline
Зарегистрирован: 05.08.2014

так в концевке #95 дельное предложение по доработке проекта с лентой для демонстрации возможностей МП. Допиляйте, убедите мир! Нужны три потока

1. Бегущие огни выводит в ленту в темпе 5Гц.

2. меняет режим вывода огней по команде с ИК пульта

3. аналогично п.2 по кнопкам, нажатие кнопки подтверждаем кратковременным свечением ленты зеленым цветом.

Контроллер атмега328 16МГц. Ленты пару метров, есть 5 - годится. 

Logik
Offline
Зарегистрирован: 05.08.2014

triac пишет:

 Так что "не пропадет ваш скорбный труд" (с), хе-хе.

Не льстите себе. Пропадет, вы сдесь не первый с этим, и даже не в десятке.