Отговори на тема  [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
атомични операции, fifo 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: атомични операции, fifo
woody написа:
Zdrav написа:
При 32 битово МЦУ записа на променлива в паметта е atomic

Само ако е подравнена.


говорим в този контекст.
syscop написа:
Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането.


Но си прав, изречението което си цитирал не е общовалидно и при положение, че в началото се говореше за FIFO без да са ясни детайлите как е имплементирано и как се използва.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Съб Юли 21, 2018 9:55 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 2:35 pm
Мнения: 1748
Мнение Re: атомични операции, fifo
То и аз заради подравняването свикнах да декларирам променливите според дължината им, не според контекста. Не знам дали може да му се укаже на компилатора да си ги размества, че да уплътнява мястото според алайнването? В общият случай е нужно да са си наместени по ширината на думата. С 8 биттовите беше лесно. С 4 битовите не съм работил, та не знам как е?


Нед Юли 22, 2018 10:50 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 8:22 am
Мнения: 15501
Местоположение: София
Мнение Re: атомични операции, fifo
При GCC(а и при всички АРМ компилатори които съм пипал) подравняването е включено по дефоулт. Например в структура, ако експлицитно не му кажеш да пакетира, ще ти ги подравни за бърз достъп и ще остави празни дупки тук, таме. Това води до някой характерни главоблъсканици при имплементиране на комуникационни протоколи например. Но определено е по-добрия вариант да е подравнено всичко, че иначе какви добре маскирани мотики има...

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Юли 23, 2018 7:49 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: атомични операции, fifo
Реконструктор написа:
Проблема ти е, че имаш прекъсване, което пише във 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 10:31 pm
Мнения: 9635
Мнение Re: атомични операции, fifo
Цецо написа:
Виж ако имаш повече от един изпращачи, нещата са малко по-сложни. Ако имаш множество получатели е на "баир лозе".

то туй вече не се нарича FIFO.

FINO/LINO обаче са гарантирано атомарни :roll:


Пон Юли 23, 2018 10:58 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: атомични операции, fifo
Може нещо да пропускам, ама...
Да приемем, че fifo-то е безкрайно.
От едното място пишем, местим указателя(wr_ptr) на следващото свободно място и т.н. От другото място четем, местим указателя(rd_ptr) на следващия елемент и т.н. - дотук добре.
Как да разберем, че fifo-то е празно -> указателя за четене да настигне указателя за запис - трябва да проверим дали са равни rd_ptr == wr_ptr ?
Затова питам за атомична операция.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Пон Юли 23, 2018 12:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 3:11 pm
Мнения: 3742
Местоположение: София
Мнение Re: атомични операции, fifo
syscop написа:
Може нещо да пропускам, ама...
Да приемем, че fifo-то е безкрайно.
От едното място пишем, местим указателя(wr_ptr) на следващото свободно място и т.н. От другото място четем, местим указателя(rd_ptr) на следващия елемент и т.н. - дотук добре.
Как да разберем, че fifo-то е празно -> указателя за четене да настигне указателя за запис - трябва да проверим дали са равни rd_ptr == wr_ptr ?
Затова питам за атомична операция.


Не е фатално, ако те прекъснат в който и да момент, стига както четенето, така - записът, да са атомарни. Т.е да нямаш наполовина записан / наполовина прочетен някой поинтър.
Най-много да прочетеш малко по-стара стойност на wr_ptr и да си помислиш, че е празно. Със същия успех поинтърът може да се промени веднага след четенето, приеми нещата философски.
Ако "другият" поинтър се променя само в прекъсване, "евтино" решение е да четеш поинтъра докато получиш 2 последователни еднакви стойности.


Пон Юли 23, 2018 12:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 8:22 am
Мнения: 15501
Местоположение: София
Мнение Re: атомични операции, fifo
Точно така, ако пойнтерите са равни значи е празно. В случая обаче не ти трябва атомична операция, даже и за сравнението. Защото писача маже само wr_ptr, а четеца маже само rd_ptr. Естествено и двамата ги четат. Нужно е само самото четене и писане на елемент във фифото да е атомично, както и самото писане на wr_ptr и rd_ptr естествено.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Юли 23, 2018 12:56 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: атомични операции, fifo
Цецо написа:

В простото класическо ФИФО, имаш два поинтера и двата се командват от различни господари. Никога не пишеш ако няма място. Никога не четеш ако нямаш какво. И нямаш нужда от синхронизация, независимо дали говорим за прекъсвания, тредове и т.н. По същество самото фифо може да се нарече обект за синхронизация, сам по себе си той е защитен.

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

А ако имаш множество получатели си построил на "баир лозе".


Перфектна дефиниция, евала!
Иначе и на мен не ми е ясно каква е дилемата. Виждам само че може би syscop разбира нещо друго под атомичност или проблемите му не са свързани с атомичността. Даже прикачения код не ми помогна да се ориентирам...


Пон Юли 23, 2018 9:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 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
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни