Ну тогда и меня записывай в разработчики осей .. диспетчер задач - подпрограмма которая сохраняет текущий контекст в заданное место и восстанавливает его из заданного места, тем самым переключая исполнение .. впервые писан ещё под КР580ИК01 .. даже не помню в каком году.. с тех пор, есть цельная библиотека на "С", по принципу ADA-задачного механизму с семействами задач, входами и т.д. и даже семафоры там не нужны ни разу.. только это не ОСь (по секрету), далеко не ось.. так, мелочь. :)
Э-э-э, простите, код .. чего? Диспетчера задач для 580ИК01? Сложновато .. мой 5-и дюймовый дисковод как-то давно заржавел, да и дискетка уж не помню где валяется .. на помойке. :)
Код диспетчера для AVR? Так их полно, бери любой .. хотя бы ту библиотеку что указана выше. setjump, longjump в помощь. Можешь взять код таймерного хука для millis() из опубликованного мною раньше. Он даже умеет блокировать повторный вызов и не блокирует время..
Размештались! Тут 80% теоретиков, знают как писать код, учат других, но сами пишут только сообщения на форум )) К ахату это не относится, он таки могет.
По вопросу. Таки да кооперативная верно, вытесняющая для 328 и им подобных - просто забыть. Но кооперативная имеет врожденный недостаток - пока один поток не кончит, другой не поедет. А это для реалтайма не гуд. Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скрівает от азработчика его реализацию. Увы, чудес не бывает.
ТС желая МП, явно не предполагал что все его потоки не реже чем раз в , допустим 1мсек, должны будут обязательно переключится (и это он явно в коде должен прописать!) и получат продолжение неизвестно когда, но не позже допустим 10мсек. Он же по комютерному мыслит - все потоки независимы;)
Logik, так и для вытесняющей системы нет ничего сложного. 32 регистра + адрес стека + состояние + адрес точки входа + байтик на флаги задачи (работает, ждет и т.д. ..) = 40 байт на процесс. Плюсом 2-4 байта для фиксации текущей задачи и так, на мелочь.. setjump, longjump берешь за основу и пишешь диспетчер задач около 160 команд (300байт кода) - оценка есть выше. Вешаешь его на прерывание от таймера и собственно всё. Остальное - правильно оформить в классах, модуле, наборе процедур .. для удобства. Работы .. на день.
И гоняй свои задачи пока не посинеют.. Десяток процессов - 400 байт из 2к. для 328 меги (НАНО).
Только это - НЕ ОС. Это её малюсенький кусочек.. :)
ОС начнется тогда, когда ты захочешь использовать UART0 (Serial.print) одновременно в нескольких процессах .. и ОС(!) должна грамотно разделить доступ к периферии. А её у микроконтроллера .. как грязи. Собственно кроме периферии-то и нет ничего.
А диспетчер .. список задач можно даже во флеш запихать .. оно ни о чем.
Многопоточность - это наша реальность. То, что больше 24 кадров в секунду (в максимальном разрешении) - это наша жизнь. И как Вы собираетесь под КР580ИК01это реализовать....
Пока что от него ничего кроме голословного трендежа с ошибками не видел.
Logik пишет:
По вопросу. Таки да кооперативная верно, вытесняющая для 328 и им подобных - просто забыть. Но кооперативная имеет врожденный недостаток - пока один поток не кончит, другой не поедет. А это для реалтайма не гуд.
Однако даже отнюдь не бесплатная кооперативная Salvo уже который десяток лет живет и здравствует. Даже в космос, говорят, летает. А все ее пользователи просто дураки такие, ага.
Logik пишет:
Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скрівает от азработчика его реализацию.
Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл.
пост №56 - практически готовый диспетчер задач. Вам лень самому написать несколько строк кода? Там все изложено на достаточно простом языке .. что-то мешает сделать самостоятельно?
Однако даже отнюдь не бесплатная кооперативная Salvo уже который десяток лет живет и здравствует. Даже в космос, говорят, летает. А все ее пользователи просто дураки такие, ага.
Ага. Без Salvo на тех же ресурсах реализовалось бы поболее. Вобще глядя на кол-во пользователей айфона я понимаю что кол-во пользователей еще не довод в споре дураки или нет ;)
triac пишет:
Logik пишет:
Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скривает от разрботчика его реализацию.
Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл.
Вы не среагировали на "ставим требования к потоку отрабатывать быстро". Это основной момент. А уж как будет реализовано переключение: сервисом недо-ОС или самописным автоматом - дело вобщем десятое. Я выбираю второе т.к. и компактней и шире возможности - я себе напишу что захочу, там вобщем и писать помелочах. Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой. А когда (или если;) человек научится разбивать поток на короткие фрагменты - ему что coos, что машинка состояния уже мелочи.
Logik, так и для вытесняющей системы нет ничего сложного....
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
leOS в помошь) Неплохая (по мне) библиотека для довольно простой реализации многопоточности. Есть еще Arduinomultitask-master, она проще, но у меня эта библиотека почему-то не пошла(
Logik, так и для вытесняющей системы нет ничего сложного....
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня. Ещё можно что-то реализовать с моей расширенной до 512 килобайт SRAM .. но и тоже, как выясняется "нафиг надо"..
Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?
Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой.
Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор. И никакого отдельного стека не надо.
Вы просто не владеете предметом, о котором разглагольствуете. Судя по всему, путаете те "а-ля прототред" каракатицы, которые сами пишете, с нормальной кооперативной осью. :)
Это комбинация старческого склероза с распальцовкой.
Пошукал, освежил память .. да, звиняюсь 580ИК01 никогда не выпускался с буквами К(Р) и в сети известен на 580ВМ1 (маркировка после 1986г: разбивка группы ИК "прочие" на ВМ и т.д.) .. и это немножко не то. Посмотреть можно тут: http://www.155la3.ru/k580.htm
Мне сейчас прикольно то, что работал с ним, и даже имея (в другой области) первую форму допуска и принимая камни непосредственно на Кристалле .. не знал о его "расширенных возможностях" .. то что он просто 5-и вольтовый и до 5Мгц - знал (поэтому и заказывали). О расширении системы команд прочитал только сейчас, по ссылке. :)
Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!
Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.
Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.
Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.
:) Это было в ответ кому и на что? (есть кнопка "цитировать") .. что искать, хекс .. зачем, кому он нужен? Исходники есть и на таймер0 от Ардуино и на I2C и на все остальное .. Вам - недоступны?
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
Кошмарить единственный i2c... это от бедности ума... Надо брать железо по задаче... тогда и потерь будет меньше... и с синхронизацией проблем не будет... Всё остальное - садомазоколхоз...
Цитата:
Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня.
Всё железное должно быть на железе... всё софтовое - на софте... И нехрен при отсутствии вменяемого железа перекладывать всё на софт... Тогда всё будет сводиться к тривиальному распределению железа, ресурсов и задач... которые априори будут асинхронными и параллельными... Софту остаётся только это обработать всё неспеша...
Цитата:
Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?
100%... Мега здесь как деревянный топор... не для этого она предназначена... Не... можно конечно, для определённых задач, поизголяться... как tester в своё время на ПИКе и ОСА... но это уже всё будет на грани возможностей железа и перегрева мозга вкраплениями АСМовых инструкций и подсчётом тактов... что уже чревато и не каждому по плечу...
Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!
Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.
Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.
Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.
Ну шо, мне поискать?
Да никому этот мусор сегодня уже не интересен... Это лет так 15 назад... может ещё быть...
Нет у вас там никакой параллельности и вытеснения априори... что сегодня уже - жуть кошмарная...
Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой.
Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор.
ОК, глянул я твой шедевр, именуемый "нормальной кооперативной осью". Я так понимаю ты автор но стесняешся. И не зря! По порядку. Прелесть рассматриваемого в краткости. На этом плюсы закончены. Специфика либы: построена на setjmp.h, прерывания, таймеры и управление стеком не задействованы. Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее. Странно было бы по другому в кооперативной МП, как следствие параметр x нахрен ненужен, он ничего не гарантирует. И "COOS_DELAY(x), причем столько, сколько мне их захочется" - не так, а достаточно часто, чтоб остальные потоки отработали, это и есть разбиение на короткие, быстро отрабатывающие части. Кстати о приоритетах. Ими автор не заморачивался но похоже получился циклический, что только усугубляет проблему при наличии быстрых и медленных потоков.
Но страшней другое. Игнорирование происходящего в стеке приведет к краху. Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)
На том все. Заранее предупреждаю, на нытье в стиле я все поправил, посмотрите какая класная версия, теперь все по другому и т.д. я не реагирую, если чё, ахат знает ;) я смотрю "шедевры" один раз, просто времени своего жалко.
Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло? :)
Logik пишет:
Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее.
Это не специфика coos, а всем известное свойство любой кооперативной оси, описанное сто пятьсот раз во всех учебниках. Выдавать это за некое "открытие америки" - это свидетельствовать о невежестве "первооткрывателя", более ни о чем.
Logik пишет:
Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
Если же хочется использовать локальные переменные за границами COOS_DELAY(x), во всей задаче, достаточно их объявить как static. Это некошерно, или нехаляльно, или вы просто не знаете что это такое? Если судить о вашем уровне по предыдущим комментариям, то очень вероятно, что не знаете, от этого и происходят ваши "возражения".
Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло?
Ваш шедевр тут явно ниче не сказал. А проблема не моя, а тех кто делеи пишет.
triac пишет:
Logik пишет:
Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее.
Это не специфика coos, а всем известное свойство любой кооперативной оси,
Так и нефиг писать "получит управление обратно через заданное число тиков х". Будем считать что неправоту этой фразы Вы осознали. Или нагуглили, неважно. Вопрос закрыт в общем случае, COOS_DELAY(x) ниче по времени не обеспечивает. В отличии от delay() кстати ;)
triac пишет:
Logik пишет:
Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
Стандарт Си читали? локальные можна использовать в пределах области видимости, а не промежутках. В промежутках хер болтается. Ну похоже и факт невозможности применения локальных согласно стандарту си тоже дошла. А любая ошибка, выводящая локальную из промежутка, (ну с точки зрения извращенной логики поделки - это ошибка) не вызовет даже ворнинга компилятора и завалит систему. А если вспомнить что современные компиляторы в порыве оптимизации и сами могут локальные втихаря делать, то надо быть конченым оптимистом чтоб надеятся на стабильность.
triac пишет:
достаточно их объявить как static. Это некошерно, или нехаляльно...
Видите сам что лажаово оно )))) на том и закончим.
ПС. Да ты не психуйте так, жирный шрифт не давите, то шо лошара кривой код написал и по коду видно. В нем все сказано и без болда. Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем.
//Если судить о вашем уровне по предыдущим комментариям..
Ну и на Ваш код интересно бы глянуть. Как там у Вас
triac пишет:
Чем зря трендеть, код в студию.
Например с использованием coos ;)
Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.
Ну и на Ваш код интересно бы глянуть. Как там у Вас
triac пишет:
Чем зря трендеть, код в студию.
Например с использованием coos ;)
Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.
Таки автор. a_coos.ino я смотрел. И уже отписался "Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем."
Посмотрел второй.
Вы писали.
triac пишет:
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
Подозреваю что на момент написания примера вы даже не подозревали о них ;)
Конкретизируйте, не надо тупого тыкания пальцем в небо. Если не способны сформулировать мысль, то лучше жуйте чего-нибудь, чем пустобрехствовать зря.
Logik пишет:
И уже отписался "Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем."
Для совсем уж наивных или безнадежно тупых идиотов, прямым текстом: то, что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ. А главное - зачем?
Есть у вас замечания по делу - пишите. Зачем бессмысленно копипастить куски из ппроектов выходного дня? У вас гондурас чешется?
Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task. Там дырка на дырке. Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.
что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ.
бедная компания с такими спецами. Я кстати тоже не с репозитория фирмы код показываю.
triac пишет:
Зачем бессмысленно копипастить куски из ппроектов выходного дня?
Ок. Будем относится к опубликованому как к дибильной шутке. Нефиг ей популяризировать. А скопипастил - для истории ;) Чтоб не открестились. Понимаю что Вам стыдно. Ну решили же - шутка. Проехали вобщем.
Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task. Там дырка на дырке. Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе. У вас, очевидно, большие проблемы с пониманием, как работает С-шный код. Аналогичные вашим проблемам с пониманием что такое кооперативная ось и как она работает.
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)
За выходные сделал, с тех пор несколько месяцев работает непрерывно. Чего еще разжевать?
Как говорится, "IQ хорош, но мог бы быть трехзначным" (с)
Logik пишет:
впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task.
Так ведь не вписана. И даже в комментах к сoos написано, что этого делать нельзя. Но ведь чукча не читатель, ага? Чукча фантазер и пейсатель.
Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Вы напомнили мне слова коллеги, сильно престарелого програмера, который строку в делфях межу потоками передавал без попыток синхронизации. "Как так?! 100000 раз проходит, 3 дня без сбоев! а на 100001 раз строка битая! Может память поменять?" Он просто не подозревал о проблемах в многопоточных приложениях, а с кодом мы тогда натрахались по командировкам.. ))) Так и у Вас гдето...
А вы всё наивно ждёте... что за вас вашу шнягу кто-то доделает???
Вы не в теме, шняга давным-давно работает. Я наивно жду, когда кто-нибудь хоть что-нибудь дельное скажет. Конкретное, вменяемое. А вижу одни только голословные невежественные высказывания, включая ваше.
Впрочем, лукавлю. От той части местных завсегдатаев, которые по тупости и невежеству взялись спорить с общеизвестными вещами, или от троллей вроде вас, мне не надо ничего, кроме поддержания темы на плаву. Благодаря этому не только ТС, но, может, еще кто-то из начинающих увидит coos и станет ее использовать, экономя себе кучу времени и усилий. Так что "не пропадетваш скорбный труд" (с), хе-хе.
Ну тогда и меня записывай в разработчики осей .. диспетчер задач - подпрограмма которая сохраняет текущий контекст в заданное место и восстанавливает его из заданного места, тем самым переключая исполнение .. впервые писан ещё под КР580ИК01 .. даже не помню в каком году.. с тех пор, есть цельная библиотека на "С", по принципу ADA-задачного механизму с семействами задач, входами и т.д. и даже семафоры там не нужны ни разу.. только это не ОСь (по секрету), далеко не ось.. так, мелочь. :)
Чем зря трендеть, код в студию.
Нужно просто включить ГОЛОВУ и отойти от концепции "скетчей" и написать всё самому ... да хоть на... С(++) и тгда будет счЯсЬе )))
))) могу дать "скетч" мигания 12-ю светодиодами с ШИМ-модуляцией+дисплей+джойстик,правда почти весь на ASM )))
мне дайте пожалуйста
Э-э-э, простите, код .. чего? Диспетчера задач для 580ИК01? Сложновато .. мой 5-и дюймовый дисковод как-то давно заржавел, да и дискетка уж не помню где валяется .. на помойке. :)
Код диспетчера для AVR? Так их полно, бери любой .. хотя бы ту библиотеку что указана выше. setjump, longjump в помощь. Можешь взять код таймерного хука для millis() из опубликованного мною раньше. Он даже умеет блокировать повторный вызов и не блокирует время..
Уточните свое желание плиз..
Чем зря трендеть, код в студию.
Размештались! Тут 80% теоретиков, знают как писать код, учат других, но сами пишут только сообщения на форум )) К ахату это не относится, он таки могет.
По вопросу. Таки да кооперативная верно, вытесняющая для 328 и им подобных - просто забыть. Но кооперативная имеет врожденный недостаток - пока один поток не кончит, другой не поедет. А это для реалтайма не гуд. Как только мы ставим требования к потоку отрабатывать быстро, ну "быстро" - в том масштабе врмени в котором работаем, то получаем все тот же автомат состояний. А coos всего лиш скрівает от азработчика его реализацию. Увы, чудес не бывает.
ТС желая МП, явно не предполагал что все его потоки не реже чем раз в , допустим 1мсек, должны будут обязательно переключится (и это он явно в коде должен прописать!) и получат продолжение неизвестно когда, но не позже допустим 10мсек. Он же по комютерному мыслит - все потоки независимы;)
Logik, так и для вытесняющей системы нет ничего сложного. 32 регистра + адрес стека + состояние + адрес точки входа + байтик на флаги задачи (работает, ждет и т.д. ..) = 40 байт на процесс. Плюсом 2-4 байта для фиксации текущей задачи и так, на мелочь.. setjump, longjump берешь за основу и пишешь диспетчер задач около 160 команд (300байт кода) - оценка есть выше. Вешаешь его на прерывание от таймера и собственно всё. Остальное - правильно оформить в классах, модуле, наборе процедур .. для удобства. Работы .. на день.
И гоняй свои задачи пока не посинеют.. Десяток процессов - 400 байт из 2к. для 328 меги (НАНО).
Только это - НЕ ОС. Это её малюсенький кусочек.. :)
ОС начнется тогда, когда ты захочешь использовать UART0 (Serial.print) одновременно в нескольких процессах .. и ОС(!) должна грамотно разделить доступ к периферии. А её у микроконтроллера .. как грязи. Собственно кроме периферии-то и нет ничего.
А диспетчер .. список задач можно даже во флеш запихать .. оно ни о чем.
Многопоточность - это наша реальность. То, что больше 24 кадров в секунду (в максимальном разрешении) - это наша жизнь. И как Вы собираетесь под КР580ИК01это реализовать....
Зачем? У вас есть задача И работающий 580-й? У меня давно нет .. и что там сложного? :)
Пока что от него ничего кроме голословного трендежа с ошибками не видел.
Однако даже отнюдь не бесплатная кооперативная Salvo уже который десяток лет живет и здравствует. Даже в космос, говорят, летает. А все ее пользователи просто дураки такие, ага.
Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл.
И не увидите. Уже давно ничего не выкладываю. Вам - все равно не зачем. :)
Ни разу не сомневался, что не увижу.
пост №56 - практически готовый диспетчер задач. Вам лень самому написать несколько строк кода? Там все изложено на достаточно простом языке .. что-то мешает сделать самостоятельно?
Однако даже отнюдь не бесплатная кооперативная Salvo уже который десяток лет живет и здравствует. Даже в космос, говорят, летает. А все ее пользователи просто дураки такие, ага.
Ага. Без Salvo на тех же ресурсах реализовалось бы поболее. Вобще глядя на кол-во пользователей айфона я понимаю что кол-во пользователей еще не довод в споре дураки или нет ;)
Так в этом и состоит сермяжная правда - скрывать от пользователя реализацию сервиса. Какая мне разница какова реализация компилятора С или операционной системы. Они выводят меня на другой уровень абстракции, в этом их смысл.
Вы не среагировали на "ставим требования к потоку отрабатывать быстро". Это основной момент. А уж как будет реализовано переключение: сервисом недо-ОС или самописным автоматом - дело вобщем десятое. Я выбираю второе т.к. и компактней и шире возможности - я себе напишу что захочу, там вобщем и писать помелочах. Но ключевой вопрос в другом - попростому, любой поднимающий вопрос о МП имеет в виду что он напишет в каждом потоке по delay и ему за это ничего не будет :) Кооперативнвя этого не позволит, потому и интерес к ней небольшой. А когда (или если;) человек научится разбивать поток на короткие фрагменты - ему что coos, что машинка состояния уже мелочи.
Logik, так и для вытесняющей системы нет ничего сложного....
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
leOS в помошь) Неплохая (по мне) библиотека для довольно простой реализации многопоточности. Есть еще Arduinomultitask-master, она проще, но у меня эта библиотека почему-то не пошла(
Та их много, а толку от них мало. Те 160 команд про которые ахат пишет любой освоивший указатели напишет. Потому и плодят хххOS.
Она привязана к железу и не обеспечивает базового сервиса - задержки выполнения задачи. Насколько я понимаю, в одной задаче просигналить SOS азбукой морзе она не может.
На среагировал на демагогию.
А чо такое кр580ик01?
Я только кр580вм80 знаю
Это его старая номенклатура до какого-то там года. :)
Это комбинация старческого склероза с распальцовкой.
Logik, так и для вытесняющей системы нет ничего сложного....
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня. Ещё можно что-то реализовать с моей расширенной до 512 килобайт SRAM .. но и тоже, как выясняется "нафиг надо"..
Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?
Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор. И никакого отдельного стека не надо.
Вы просто не владеете предметом, о котором разглагольствуете. Судя по всему, путаете те "а-ля прототред" каракатицы, которые сами пишете, с нормальной кооперативной осью. :)
Это комбинация старческого склероза с распальцовкой.
Пошукал, освежил память .. да, звиняюсь 580ИК01 никогда не выпускался с буквами К(Р) и в сети известен на 580ВМ1 (маркировка после 1986г: разбивка группы ИК "прочие" на ВМ и т.д.) .. и это немножко не то. Посмотреть можно тут: http://www.155la3.ru/k580.htm
Мне сейчас прикольно то, что работал с ним, и даже имея (в другой области) первую форму допуска и принимая камни непосредственно на Кристалле .. не знал о его "расширенных возможностях" .. то что он просто 5-и вольтовый и до 5Мгц - знал (поэтому и заказывали). О расширении системы команд прочитал только сейчас, по ссылке. :)
Серьёзно???
Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!
Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.
Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.
Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.
Ну шо, мне поискать?
:) Это было в ответ кому и на что? (есть кнопка "цитировать") .. что искать, хекс .. зачем, кому он нужен? Исходники есть и на таймер0 от Ардуино и на I2C и на все остальное .. Вам - недоступны?
Там сверху просят код ШИМ-моргалки 12-ю светодиодами. (а так я цитировать и нажимал )))
Ясно. Ну .. тут на форуме все время какой-нить код просют .. попрошайки-с, как сказал бы поручик. :)
Дык я рыбу всё равно не дам, а удочку - пожалуйста:)
Сложное не в реализации переключения, хотя в вашом описании таки своего стека для каждого процесса не хватает, без него совсем все по уродски будет. Дело в другом - в необходимости синхронизации процессов и сложностей доступа к единой переферие из разных процессов, там выше про i2c писалось, верно в общем. Потому 160 команд переключения свое отработают, но порождают массу проблем, в принципе тоже решаемых - мютексы, критические секции, очереди сообщений. Но вот решение этих проблем уже в 328-й не влазит ;)
Кошмарить единственный i2c... это от бедности ума... Надо брать железо по задаче... тогда и потерь будет меньше... и с синхронизацией проблем не будет... Всё остальное - садомазоколхоз...
Так именно за это и речь была! Что реализовать вытесняющее переключение задач - это малая толика от ОС и, действительно, вполне по силам любому. А полноценно рапределять ресурсы и разделять их между процессами - тяму не хватает. Ни у пейсателей ни у камня.
Всё железное должно быть на железе... всё софтовое - на софте... И нехрен при отсутствии вменяемого железа перекладывать всё на софт... Тогда всё будет сводиться к тривиальному распределению железа, ресурсов и задач... которые априори будут асинхронными и параллельными... Софту остаётся только это обработать всё неспеша...
Для управления периферией, родных 8кб меги2560 - вполне достаточно. Остаются задачи обработки данных, требующих соразмерных массивов, а тут опять же скрипач (ОС) не нужен по большей части.. да и задачи: обработку картинок, звука проще вести на 32-х разрядных АРМ .. цена практически та же или даже меньше. Смысл лезть не в свою нишу (писать ОС под Меги)?
100%... Мега здесь как деревянный топор... не для этого она предназначена... Не... можно конечно, для определённых задач, поизголяться... как tester в своё время на ПИКе и ОСА... но это уже всё будет на грани возможностей железа и перегрева мозга вкраплениями АСМовых инструкций и подсчётом тактов... что уже чревато и не каждому по плечу...
Сразу говорю - он на ассемблере в виде вектора прерывания на таймер0 (по сути любой), НО!!! 0-й таймер на ардуине занят счётчиками тиков даже в пустом скетче!
Дисплей по I2C с библиотекой не от ардуино вообще и библиотеку такую вы не найдёте в интернете - она самописная.
Драйвер клавиатуры на 1348 так-же самописный, джойстик то-же.
Для "извращенцев" могу скинуть готовый .hex для экспериментов. Схему вот только не помню, было енто дело давно и под пиффко и на спор, что так можно. По сути можно и 30 светодиодов так коммутировать - разницы нет, лишь бы выходов у проца хватило.
Ну шо, мне поискать?
Да никому этот мусор сегодня уже не интересен... Это лет так 15 назад... может ещё быть...
Нет у вас там никакой параллельности и вытеснения априори... что сегодня уже - жуть кошмарная...
Используя coos, я пишу в каждом потоке COOS_DELAY(x), причем столько, сколько мне их захочется иметь в треде, и ничего плохого не случается. Кооперативная ось это позволяет. Управление при этом передается в ось, а через заданное число тиков х возвращается в поток, на следующий после COOS_DELAY(x) оператор.
ОК, глянул я твой шедевр, именуемый "нормальной кооперативной осью". Я так понимаю ты автор но стесняешся. И не зря! По порядку. Прелесть рассматриваемого в краткости. На этом плюсы закончены. Специфика либы: построена на setjmp.h, прерывания, таймеры и управление стеком не задействованы. Негативы: поток вызвавший COOS_DELAY(x) не имеет гарантии что "получит управление обратно через заданное число тиков х", как заявляет автор, Вобще б даже для взрослой кооперативной ОС такое нереализуемо. Он получит его только после того как другой поток сделает свой COOS_DELAY(x) и никак не ранее. Странно было бы по другому в кооперативной МП, как следствие параметр x нахрен ненужен, он ничего не гарантирует. И "COOS_DELAY(x), причем столько, сколько мне их захочется" - не так, а достаточно часто, чтоб остальные потоки отработали, это и есть разбиение на короткие, быстро отрабатывающие части. Кстати о приоритетах. Ими автор не заморачивался но похоже получился циклический, что только усугубляет проблему при наличии быстрых и медленных потоков.
Но страшней другое. Игнорирование происходящего в стеке приведет к краху. Стоит в потоках обявить локальные переменные и сушим весла. Автор в примере обходится без локальных, может чего подозревает или скрывает что ;)
На том все. Заранее предупреждаю, на нытье в стиле я все поправил, посмотрите какая класная версия, теперь все по другому и т.д. я не реагирую, если чё, ахат знает ;) я смотрю "шедевры" один раз, просто времени своего жалко.
Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло? :)
Это не специфика coos, а всем известное свойство любой кооперативной оси, описанное сто пятьсот раз во всех учебниках. Выдавать это за некое "открытие америки" - это свидетельствовать о невежестве "первооткрывателя", более ни о чем.
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
Если же хочется использовать локальные переменные за границами COOS_DELAY(x), во всей задаче, достаточно их объявить как static. Это некошерно, или нехаляльно, или вы просто не знаете что это такое? Если судить о вашем уровне по предыдущим комментариям, то очень вероятно, что не знаете, от этого и происходят ваши "возражения".
Logik, вы со своим "ключевым вопросом" #63 разобрались, или все еще не дошло?
Ваш шедевр тут явно ниче не сказал. А проблема не моя, а тех кто делеи пишет.
Это не специфика coos, а всем известное свойство любой кооперативной оси,
Так и нефиг писать "получит управление обратно через заданное число тиков х". Будем считать что неправоту этой фразы Вы осознали. Или нагуглили, неважно. Вопрос закрыт в общем случае, COOS_DELAY(x) ниче по времени не обеспечивает. В отличии от delay() кстати ;)
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
Стандарт Си читали? локальные можна использовать в пределах области видимости, а не промежутках. В промежутках хер болтается. Ну похоже и факт невозможности применения локальных согласно стандарту си тоже дошла. А любая ошибка, выводящая локальную из промежутка, (ну с точки зрения извращенной логики поделки - это ошибка) не вызовет даже ворнинга компилятора и завалит систему. А если вспомнить что современные компиляторы в порыве оптимизации и сами могут локальные втихаря делать, то надо быть конченым оптимистом чтоб надеятся на стабильность.
достаточно их объявить как static. Это некошерно, или нехаляльно...
Видите сам что лажаово оно )))) на том и закончим.
ПС. Да ты не психуйте так, жирный шрифт не давите, то шо лошара кривой код написал и по коду видно. В нем все сказано и без болда. Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем.
//Если судить о вашем уровне по предыдущим комментариям..
Ну даффайте судить. Так, чисто для уровнями померится из старенького http://arduino.ru/forum/proekty/akvakontroller-maksimum-iz-mini Или код чтоб решить вам для ся, определится, знаю я про статик или нет -http://arduino.ru/forum/apparatnye-voprosy/gsm-modem-a6-v-rezhime-tcp Понравится - ищи, тут много.
Ваш шедевр тут явно ниче не сказал. А проблема не моя, а тех кто делеи пишет.
Это в ваших "а-ля прототред" проблема, а в coos этой проблемы нет в принципе. Пишите COOS_DELAY(x) сколько хотите. Все еще не дошло?
А жирный шрифт для большей понятности использую. Когда оппонент совсем тупой и не способен отличить главное от второстепенного.
Ну и на Ваш код интересно бы глянуть. Как там у Вас
Чем зря трендеть, код в студию.
Например с использованием coos ;)
Чем зря трендеть, код в студию.
Например с использованием coos ;)
Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.
Чем зря трендеть, код в студию.
Например с использованием coos ;)
Примера a_coos.ino вам мало, не догоняете? Ну посмотрите тогда другой пример, для LED strip. Там немножко другой вариант coos использован, но сути не меняет.
Таки автор. a_coos.ino я смотрел. И уже отписался "Беда ваша и таких писак как вы что свою "ОС" вы дальше блинка не продумуете, и не тестите. А амбиций имеете как на решение мировых проблем."
Посмотрел второй.
Вы писали.
Нет никаких проблем использовать локальные переменные в промежутках между вызовами COOS_DELAY(x).
И это тоже писали.
Вы сами нарушаете свои требования. Подозреваю что на момент написания примера вы даже не подозревали о них ;)
Конкретизируйте, не надо тупого тыкания пальцем в небо. Если не способны сформулировать мысль, то лучше жуйте чего-нибудь, чем пустобрехствовать зря.
Для совсем уж наивных или безнадежно тупых идиотов, прямым текстом: то, что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ. А главное - зачем?
Есть у вас замечания по делу - пишите. Зачем бессмысленно копипастить куски из ппроектов выходного дня? У вас гондурас чешется?
Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task. Там дырка на дырке. Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.
что я делаю на работе, принадлежит компании, где я работаю, и посему не подлежит выкладыванию в открытый доступ.
Зачем бессмысленно копипастить куски из ппроектов выходного дня?
Куда уж конкретней. Я смотрю писать вам словами - пустая трата времени. У Вас ваш проект надеюсь под рукой. Завершите цикл например coos_task2. Обычным ретурном, допусти после 10 проходов или секунд, как Вам удобней. Или впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task. Там дырка на дырке. Все упадет. Иногда не сразу, как глюк ляжет))) Ищите причину. Может так поймете проблему со стеком.
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе. У вас, очевидно, большие проблемы с пониманием, как работает С-шный код. Аналогичные вашим проблемам с пониманием что такое кооперативная ось и как она работает.
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)
Смешно. Несколько месяцев как работает, гоняет 5-метровую RGB ленту. Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Так выходного дня или несколько месяцев/лет? Хотя какая вобщем разница ;)
За выходные сделал, с тех пор несколько месяцев работает непрерывно. Чего еще разжевать?
Как говорится, "IQ хорош, но мог бы быть трехзначным" (с)
впишите COOS_DELAY в любые несколько функцию вызываемых из разных coos_task.
Так ведь не вписана. И даже в комментах к сoos написано, что этого делать нельзя. Но ведь чукча не читатель, ага? Чукча фантазер и пейсатель.
Пальцем не трогал. До этого аналогичный код отработал пару лет на немножко другом железе.
Вы напомнили мне слова коллеги, сильно престарелого програмера, который строку в делфях межу потоками передавал без попыток синхронизации. "Как так?! 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 И пашет годами, это все простые проекты (ну за исключением ассемблерного кода который я сам писал, а вы либку подцепили). Такие штуки, как и блинк, пишутся на раз полюбому. А примера сложного, с меню, протоколами обмена и др. растянутыми по времени и быстрыми - сервы, шим, датчики. Там все сразу ясно. Хотите попробывать - поцепите к своей ленте приемник ИК и с пульта поуправлять во время непрерывных динамических эффектов на ленте. Четко два потока! Хрен сделаете! )))
Так и у Вас гдето..
Ничего конкретного сказать не можете, продолжайте бредить.
Ничего конкретного сказать не можете
А вы всё наивно ждёте... что за вас вашу шнягу кто-то доделает???
Ничего конкретного сказать не можете
А вы всё наивно ждёте... что за вас вашу шнягу кто-то доделает???
Вы не в теме, шняга давным-давно работает. Я наивно жду, когда кто-нибудь хоть что-нибудь дельное скажет. Конкретное, вменяемое. А вижу одни только голословные невежественные высказывания, включая ваше.
Впрочем, лукавлю. От той части местных завсегдатаев, которые по тупости и невежеству взялись спорить с общеизвестными вещами, или от троллей вроде вас, мне не надо ничего, кроме поддержания темы на плаву. Благодаря этому не только ТС, но, может, еще кто-то из начинающих увидит coos и станет ее использовать, экономя себе кучу времени и усилий. Так что "не пропадет ваш скорбный труд" (с), хе-хе.
так в концевке #95 дельное предложение по доработке проекта с лентой для демонстрации возможностей МП. Допиляйте, убедите мир! Нужны три потока
1. Бегущие огни выводит в ленту в темпе 5Гц.
2. меняет режим вывода огней по команде с ИК пульта
3. аналогично п.2 по кнопкам, нажатие кнопки подтверждаем кратковременным свечением ленты зеленым цветом.
Контроллер атмега328 16МГц. Ленты пару метров, есть 5 - годится.
Так что "не пропадет ваш скорбный труд" (с), хе-хе.
Не льстите себе. Пропадет, вы сдесь не первый с этим, и даже не в десятке.