Заканчиваю участие

104 views
Skip to first unread message

Александр Литягин

unread,
Oct 10, 2016, 6:13:15 AM10/10/16
to uOS embedded
Привет всем!
проект наш в котором использовали uos закрылся, и работа с ней свернута. все наработки я выложил в своем форке https://github.com/alexrayne/uos-embedded
запрос на объединение висит в пул-реквестах у основного репа.
из того что желающим может пригодиться:
1) поддержка плюсов - мой проект был плюсовый, вполне себе с классами. хотя поддержку исключения так и не проверил
2) новые модули 
   - /streem/stream-mt - это стрим с блокировкой вывода используемой в строковом выводе puts/ptintf. позволяет предотвратить смешивание строк при конурентном выводе
   - порт freeModBUS - вот тут https://bitbucket.org/alexrayne/freemodbus
   - elvees/dev/dma_mem - прикрутил менегер - очередь запросов к ДМА
   - etimer - очередь событий. функции ожидания posix - sleep/usleep могут использовать ее. в отличие от timer_delay не ест время процессора в ожидании. вполне отлажено но топорное использование может привести к краху.
   - условное ожидание мутеха - etimerу оно очень нужно. позволяет более гибко реализовывать многие вещи
ну и по мелочи.
Много было еще планов, но селяви. всем пока.


Serge V.

unread,
Oct 11, 2016, 1:24:39 AM10/11/16
to uOS embedded
Добрый день, Александр!

Большое спасибо за Ваш вклад. Я попытался было заинтегрировать Ваши изменения, но заткнулся на sources/kernel/main.c. Там нетривиальные отличия от основной ветки, а я сейчас слишком дал]к от реального применения uOS, чтобы быстро разобраться, что к чему. Оставлю на потом. Или может быть кто из активных участников возьмётся.

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

С уважением,
Сергей Вакуленко

Александр Литягин

unread,
Oct 11, 2016, 2:39:10 AM10/11/16
to uOS embedded
А какие изменения смущают?
там довольно нетривиально я сделал реализацию task_yield - вот она действительно мне пару рабочих дней плеш проедала:
основная задача была обеспечить чтобы каждый вызов task_yield последовательно перебирал все нитки в очереди шедулера не взирая на текущую и на ее приоритет. 
я столкнулся с зависанием программы изза старого поведения - если нет более приоритетных ниток, то yield просто продолжает выполнять текущую нитку. 
другой вариант зависания - иза того что вышедшая нитка ставилась в голову очереди, она при вызове yield выполнялась следующей, в результате yield просто попеременно выполняет 2 нитки первых в очереди. 
соответственно если вы yieldите в цикле ожидания, для чего вобщемто и  yield и нужен, вы получаете зависание всех остальных ниток на время ожидания этим yieldом.
для борьбы с этой бедой, я хитро выключаю из очереди шедулера нитку вышедшую yieldом, и восстанавливаю очередь при любом другом переключении задач. этот вариант еще не идеален, но он гораздо надежнее чем то что было.

вторник, 11 октября 2016 г., 8:24:39 UTC+3 пользователь Serge V. написал:
Reply all
Reply to author
Forward
0 new messages