Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Оптимизиран thread safe FIFO за АРМ
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13061
Страница 1 от 3

Автор:  Цецо [ Пон Юли 14, 2014 8:00 pm ]
Заглавие:  Оптимизиран thread safe FIFO за АРМ

Някой да е срещал нещо фрии по въпроса. Аз съм си написал някакви библиотечки, ама ми се ще да погледна и нещо направено от по-умни хора.

Търси се нещо дето да е леко като за АРМ ембедед система, да е мултитред. И да работи добре за байтове и цели думи. Скоростта е от по-критично значение от универсалността, т.е. не ми трябват C++ имплементации, свързани списъци и т.н.

Автор:  miro_atc [ Пон Юли 14, 2014 8:36 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

конкретизарай малко повече, защото има много вариации....
Най-простият вариант е когато имаш по една нишка от всяка страна, тогава стандартния кю си бачка и нямаш нужда от арм трикове.
Ако имаш по повече от една нишка на страна то най-добре да си ги синхронизираш с примитивите на ОС-а (надявам се ползваш ОС). Макар че нещо не схващам смисъла на байт кю и много нишки.
Все пак ако трябва подобна щуротия спокойно може да си сложиш забрана на прекъсванията в push(). А pop() може да го направиш с екслузив достъп.
И спокойно може да си го направиш в Ц++ шаблон ако искаш хем да е универсално хем бързо.

Автор:  Цецо [ Вто Юли 15, 2014 10:09 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

По една нишка е от всяка страна, търкалям плейн С, трябва ми за байтове и думи тръба. Т.е. атомични слагания и вадения.

Автор:  miro_atc [ Вто Юли 15, 2014 10:32 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Нещо май ти е време за почивка, жегата ти идва в повече ;-)

Нямаш нужда от атомичности и други циркове... Фифото се прави с един кръгов буфер и два указателя. Единият указател се бара само от едната страна/нишка, другият само от другата. Няма как да стане инфекция, куртексите нямат толкова дълбоки кешове че да ти разбъркат нещата.

Автор:  Цецо [ Вто Юли 15, 2014 10:45 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Аз така съм го направил. :) Ама някъде после в момент на временно (надявам се ) умопомрачение, съм го рационализирал и сам наврял вътре и една променлива която инкрементвам и декрементвам съответно при тъпкане и вадене. Идеята ми ... вероятно е била да забързам проверките за състоянието на тръбата. Само дето тая променлива се бара и от двете страни, а инкрементването и декрементването в рама не е атомична операция (нали така). И сега наблюдавам разни странни ефекти... Та ми се прищя да видя нещо написано от по-умни от мен.

Сега ще пробвам да я разкарам въобще и да си смятам глава - опашка както си му е реда.

Автор:  miro_atc [ Вто Юли 15, 2014 11:52 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Цецо написа:
Само дето тая променлива се бара и от двете страни, а инкрементването и декрементването в рама не е атомична операция (нали така).

мда.. трябва да е атомична, ама за къф си го набутваш с общата променлива не знам...


Цитат:
Та ми се прищя да видя нещо написано от по-умни от мен.

Умниците ги търси за по-смислени неща;-)
Иначе не помня източник, тва по ОС-вете обикновено е по-сложните варианти един към много със синхронизации ала-бала...
По-скоро виж STL или учебникарски примерчета, в Ц++ обикновено ги слагат... То и аз съм правил нещо такова, макар че ти сигурно пак няма да ти хареса че е шаблон. Но точно шаблон е най-подходящ за подобни глупости, компилаторите го мачкат като прасе зрели круши ;-) Докато кода си остава прегледен и защитен, ама като те знам по-добре да не ти обяснявам ;-)

Автор:  Цецо [ Вто Юли 15, 2014 11:58 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Един ден като стана голям... вероятно ще мина на C++... ама още съм малък.

Автор:  miro_atc [ Вто Юли 15, 2014 12:07 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

малък, ама глупав :P

вместо да гониш девойките тръгнал да се мъчи с голи Ц :D

опс, голО Ц имах предвид, ама явно за друго съм си мислел ;-)

Автор:  Цецо [ Вто Юли 15, 2014 3:19 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Мен викаш жегата ме мъчи, а....

Автор:  gicho [ Вто Юли 15, 2014 9:11 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Забрана на прекъсванията от двете страни докато пипаш общи неща е гарантирано решение. Предполагам че имаш нужда да защитиш няколко инструкции само, така че си на 6.

Автор:  Цецо [ Вто Юли 15, 2014 10:40 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

А оправих го, просто махнах паразитната променлива. Забрана на прекъсвания не се налага, в най-простия случай двата процеса наистина няма какво да делят.

Автор:  gicho [ Сря Юли 16, 2014 10:36 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Без кода е трудно да се разсъждава, но се сещам за две ситуации, в които "си делят":
- проверка за препълване от страна на пишещия
- проверка за празен от страна на четящия
В тези случаи трябва да се сравняват двата пойнтъра, което е потенциална работа със "споделени" променливи?

Автор:  miro_atc [ Сря Юли 16, 2014 11:06 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

gicho, май и на теб ти е време да разрешиш "прекъсванията" за по една бира ;-)

Имаш два указателя - in & out, които във всеки един момент от времето разделят буфера на пълна и празна част.

Пишештата страна може да маже в празната част колкото и когато си поиска. Никой друг не би трябвало да се интересува какво става там. В момента в който се запише нова стойност, пишештият мести единия указател. Местенето е просто запис, който на почти всички архитектури е атомична операция. Демек останалите до един момент виждат "празно" и изведнъж се появява нова стойстоност и празното е намаляло.

При четенето е по същия начин, четящият може да си чете колкото иска от пълната част и като се начете си мести неговия указател и всички останали изведнъж виждат как празната част се е увеличила.

Автор:  bateAz [ Сря Юли 16, 2014 11:32 am ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Зависи от идеологията.
Някои реализации на FIFO при запълване не спират да пълнят, ами презаписват на местото на старите данни ( и естествено, пипат и указателя за четене ). Идеята е, ако за известно време спреш да четеш, да имаш последните, а не първите данни. Там проблеми ще има.

Автор:  Цецо [ Сря Юли 16, 2014 12:07 pm ]
Заглавие:  Re: Оптимизиран thread safe FIFO за АРМ

Точно.

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/