Виж темите без отговор | Виж активните теми
Дата и час: Чет Мар 28, 2024 5:33 pm
Автор |
Съобщение |
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: атомични операции, fifo
говорим в този контекст. Но си прав, изречението което си цитирал не е общовалидно и при положение, че в началото се говореше за FIFO без да са ясни детайлите как е имплементирано и как се използва.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Съб Юли 21, 2018 9:55 am |
|
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 1:55 pm Мнения: 1792 Местоположение: София
|
Re: атомични операции, fifo
Излезе една мода да се толерира (хардуерно) неподравнен достъп за удобство на програмистите, та затова трябва да се внимава. Атомичност се гарантира само при подравнен достъп на дума (и по-малки размери, тъй като реално са достъп на дума с bytelane маски). В load-store архитектури като ARM неща като RMW няма.
Питащият не е уточнил коя точно архитектура е, но ако е v6/v7 най-лесно примитиви за синхронизация се правят с ldrex/strex, и ще са generic за всичко. Иначе FIFO може да се направи по различни начини, но някои ще работят на конкретното желязо, а в бъдеще ще фалират на друго или на друга софтуерна подложка.
Един алтернативен вариант е FIFO с указатели които са дефинирани volatile, за случаите когато има точно един писател и точно един читател. Писателят променя само write pointer, четецът само read pointer. Няма нужда от повече синхронизация. Като негатив в зависимост от размера на FIFO-то и интеракцията между пълненето и празненето, понякога може за момент да не се ползва на 100%.
|
Съб Юли 21, 2018 10:30 am |
|
|
bobihot
Ранг: Форумен бог
Регистриран на: Сря Фев 13, 2013 2:35 pm Мнения: 1748
|
Re: атомични операции, fifo
То и аз заради подравняването свикнах да декларирам променливите според дължината им, не според контекста. Не знам дали може да му се укаже на компилатора да си ги размества, че да уплътнява мястото според алайнването? В общият случай е нужно да са си наместени по ширината на думата. С 8 биттовите беше лесно. С 4 битовите не съм работил, та не знам как е?
|
Нед Юли 22, 2018 10:50 am |
|
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 8:22 am Мнения: 15501 Местоположение: София
|
Re: атомични операции, fifo
При GCC(а и при всички АРМ компилатори които съм пипал) подравняването е включено по дефоулт. Например в структура, ако експлицитно не му кажеш да пакетира, ще ти ги подравни за бърз достъп и ще остави празни дупки тук, таме. Това води до някой характерни главоблъсканици при имплементиране на комуникационни протоколи например. Но определено е по-добрия вариант да е подравнено всичко, че иначе какви добре маскирани мотики има...
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
Пон Юли 23, 2018 7:49 am |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7878 Местоположение: София
|
Re: атомични операции, fifo
Проблема ти е, че имаш прекъсване, което пише във fifo-то и те е страх, че ще се омажат нещата, когато се чете от основния цикъл?
|
Пон Юли 23, 2018 9:59 am |
|
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 10:31 pm Мнения: 9635
|
Re: атомични операции, fifo
сглобяването на структури и приятели е работа на лейаута на компилатора. какво ще се получи зависи от конкретната компилация. gcc има 4-5 опции по въпроса (при компилиране на компилатора), затова, ако ти е важно как се държи компилатора, трябва да си го изкомпилираш сам. не всичко може да се превключва през опция и/или атрибут
за CLANG не съм много наясно, доколкото чувам крос-CLANG е още по-голяма мътилка и от gcc
|
Пон Юли 23, 2018 10:02 am |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: атомични операции, fifo
Долу-горе. Мога да вдигна флаг, с който да кажа на другите да не пипат по fifo-то. Не знам точно как да процедирам с флага - ще се стигне до следното: проверявам флага от главния цикъл, в същото време (по законите на Мърфи) идва прекъсване и handler-а променя флага, защото трябва да пипа по fifo-то. Та според мен операцията по смяна/проверка на флага трябва да е атомична - един път започнала трябва да завърши без друг може да се намеси.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Пон Юли 23, 2018 10:18 am |
|
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 8:22 am Мнения: 15501 Местоположение: София
|
Re: атомични операции, fifo
Продължаваш да не казваш какво имаш на входа и изхода на фифо-то. Ако имаш само по един изпращач и един получател, както Миро каза - в общия случай не ти трябва синхронизация.
В простото класическо ФИФО, имаш два поинтера и двата се командват от различни господари. Никога не пишеш ако няма място. Никога не четеш ако нямаш какво. И нямаш нужда от синхронизация, независимо дали говорим за прекъсвания, тредове и т.н. По същество самото фифо може да се нарече обект за синхронизация, сам по себе си той е защитен.
Виж ако имаш повече от един изпращач, нещата са малко по-сложни - ще трябва да синхронизираш.
А ако имаш множество получатели си построил на "баир лозе".
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
Последна промяна Цецо на Пон Юли 23, 2018 11:00 am, променена общо 1 път
|
Пон Юли 23, 2018 10:55 am |
|
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 10:31 pm Мнения: 9635
|
Re: атомични операции, fifo
то туй вече не се нарича FIFO. FINO/LINO обаче са гарантирано атомарни
|
Пон Юли 23, 2018 10:58 am |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: атомични операции, fifo
Може нещо да пропускам, ама... Да приемем, че fifo-то е безкрайно. От едното място пишем, местим указателя(wr_ptr) на следващото свободно място и т.н. От другото място четем, местим указателя(rd_ptr) на следващия елемент и т.н. - дотук добре. Как да разберем, че fifo-то е празно -> указателя за четене да настигне указателя за запис - трябва да проверим дали са равни rd_ptr == wr_ptr ? Затова питам за атомична операция.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Пон Юли 23, 2018 12:21 pm |
|
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 3:11 pm Мнения: 3742 Местоположение: София
|
Re: атомични операции, fifo
Не е фатално, ако те прекъснат в който и да момент, стига както четенето, така - записът, да са атомарни. Т.е да нямаш наполовина записан / наполовина прочетен някой поинтър. Най-много да прочетеш малко по-стара стойност на wr_ptr и да си помислиш, че е празно. Със същия успех поинтърът може да се промени веднага след четенето, приеми нещата философски. Ако "другият" поинтър се променя само в прекъсване, "евтино" решение е да четеш поинтъра докато получиш 2 последователни еднакви стойности.
|
Пон Юли 23, 2018 12:51 pm |
|
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 8:22 am Мнения: 15501 Местоположение: София
|
Re: атомични операции, fifo
Точно така, ако пойнтерите са равни значи е празно. В случая обаче не ти трябва атомична операция, даже и за сравнението. Защото писача маже само wr_ptr, а четеца маже само rd_ptr. Естествено и двамата ги четат. Нужно е само самото четене и писане на елемент във фифото да е атомично, както и самото писане на wr_ptr и rd_ptr естествено.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
Пон Юли 23, 2018 12:56 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10356 Местоположение: Добрич
|
Re: атомични операции, fifo
Перфектна дефиниция, евала! Иначе и на мен не ми е ясно каква е дилемата. Виждам само че може би syscop разбира нещо друго под атомичност или проблемите му не са свързани с атомичността. Даже прикачения код не ми помогна да се ориентирам...
|
Пон Юли 23, 2018 9:59 pm |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: атомични операции, fifo
Май нещо ме е подгонила параноята... Ще направя както предложи bateAz - двойна проверка и ще следя г-н Мърфи да не се появи отнякъде
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Вто Юли 24, 2018 8:05 am |
|
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 8:22 am Мнения: 15501 Местоположение: София
|
Re: атомични операции, fifo
Проблема ти е фундаментален и се увери, че разбираш какво правиш (или поне се опитваш да направиш). Малко ти се мешат неща като синхронизация, атомичност, многозадачност - незнам от изказа ли е така или наистина са омешани. Ама сега е момента да си ги избистриш, щото това си е крайъгълен камък на всеки софтуер. Лошото на такива бъгове е, че може и никога да не се проявят, а може и да гръмне баш кога не трябва... И са адски трудни за хващане и дебъгване. Та там стъпването на мотиката определено не е най-добрия начин за учене.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
Вто Юли 24, 2018 9:38 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 6 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|