| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| атомични операции, fifo http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16039 |
Страница 1 от 3 |
| Автор: | syscop [ Пет Юли 20, 2018 2:41 pm ] |
| Заглавие: | атомични операции, fifo |
Имам едно fifo, което го пълня с данни от една нишка и го чета от друга. OS-a е nuttx, има posix threads и няма проблеми. Налага се да ползвам същото нещо на друго mcu, но там няма os - bare metal. Въпросът е как да направя нещо подобно на mutex, без да имам os. |
|
| Автор: | miro_atc [ Пет Юли 20, 2018 3:11 pm ] |
| Заглавие: | Re: атомични операции, fifo |
Нещо не разбирам въпроса... Значи от фифо до фифо има разлика, а пък мютекс е друга бира. Ако фифо-то го ползваш да пъхаш от една "нишка" и вадиш от друга няма никакъв проблем. Това си е кръгов буфер с два указателя и тъй като всеки указател се променя само от една нишка нямаш конфликт. Това е 1:1 ситуация. Ако обаче искаш да имаш две или повече нишки от една и съща страна на фифото вече трябва да ги синхронизираш. Предполагам затова и споменаваш мютекс, т.е. преди си имал повече от една нишка от дадена страна. Ако е така проблемът ти е смяна на контекста, а не атомичността. То пак е нужна атомичност, но само за да поддържаш информация кой ще кара влака. След това като стигнеш до зает ресурс някак си трябва да блокираш, т.е. да смениш контекста. Затова си трябва кърнелче някакво или помощ от хардуера... |
|
| Автор: | syscop [ Пет Юли 20, 2018 3:21 pm ] |
| Заглавие: | Re: атомични операции, fifo |
Не намерих дали при arm записа в една клетка памет е атомична, т.е. имам volatile int32_t i и като напиша i = 32 ще се запише толкова без значение, че по време на записа може да дойде прекъсване. Ако обработката на прекъсването изчака края на присвояването, няма да има проблем със синхронизирането. |
|
| Автор: | TheWizard [ Пет Юли 20, 2018 3:44 pm ] |
| Заглавие: | Re: атомични операции, fifo |
мутекс на баре метал - демек няма кой да бара контекса освен прекъсване... статик флаг във функията пробвай |
|
| Автор: | t_i_t_o [ Пет Юли 20, 2018 5:24 pm ] | |||||||||
| Заглавие: | Re: атомични операции, fifo | |||||||||
Запис/четене е атомично стига да е не по голямо от разредността на процесора, но инкрементиране (четене-модифициране-запис) не е атомично и трябва да го защитиш. |
||||||||||
| Автор: | relsys [ Пет Юли 20, 2018 6:25 pm ] | ||||||||||||||||||
| Заглавие: | Re: атомични операции, fifo | ||||||||||||||||||
Ето как съм го реализирал някога:
Съответно ето ги и структурите:
Тук идеята е, както t_i_t_o каза, да се откопира указателя u16 head;, за това е и първи в структурата. След това няма значение, дали нещо го е променило в оригиналната дестинация, както и дали буфера е допълнен с нови данни. Те просто ще минат на следващата итерация. |
|||||||||||||||||||
| Автор: | syscop [ Пет Юли 20, 2018 6:57 pm ] | ||||||||||||||||||
| Заглавие: | Re: атомични операции, fifo | ||||||||||||||||||
Това е листинга от асемблера
Три инструкции са, т.е. според мен не е атомична операцията. Ше го мисля още... |
|||||||||||||||||||
| Автор: | Zdrav [ Пет Юли 20, 2018 9:32 pm ] |
| Заглавие: | Re: атомични операции, fifo |
самия запис е само последната инструкция. така че няма как да не е атомик. |
|
| Автор: | syscop [ Пет Юли 20, 2018 10:02 pm ] |
| Заглавие: | Re: атомични операции, fifo |
То това ме притеснява. Кодът, който ползвам не е само мой, та не знам дали ако между 1,2 или 2,3 стане прекъсване, някой няма да е успял да омаже регистъра. Ако бях като tgi нямаше въобще да повдигам въпроса |
|
| Автор: | gicho [ Пет Юли 20, 2018 10:33 pm ] |
| Заглавие: | Re: атомични операции, fifo |
Да сложиш ОС заради синхронизиране на едно FIFO Класическото решение е забрана на прекъсванията около зоната на възможен конфликт - ако ти е няколко инструкции изобщо не е проблем. ОС-аджиите му викат критична секция ("critical section"). Не опитвай с флаг, гарантирано не работи - освен ако не забраниш прекъсванията поне около проверката на флага и манипулацията му. Но ако е само 32битова променлива няма нужда да се притесняваш. |
|
| Автор: | syscop [ Пет Юли 20, 2018 10:54 pm ] |
| Заглавие: | Re: атомични операции, fifo |
OS-а не е заради fifo-то. Там имам малък проблем с драйвер, та реших да извадя съмнителните неща отделно, да ги тествам, без всички излишните щуротии на os-a и чак тогава да ги върна на място. Една променлива е достатъчна да отбележа, дали да (не) се пипа някъде, така че ще пробвам да видя какво ще стане. |
|
| Автор: | ToHu [ Пет Юли 20, 2018 10:58 pm ] |
| Заглавие: | Re: атомични операции, fifo |
И защо флаг да не работи, в крайна сметка всички ОС свързани методи се свеждат до флаг ...въпросът е къде сетваш флага, кой може да го бута и кога буташ данните. Забрана на прекъсване е най-лесният метод, и аз бих го използвал но далеч не е най-правилния, в другата тема miro писа защо, не мога да не съм съгласен с него въпреки лично аз да нарушавам това правило, най-вече защото рядко да не кажа почти никога не не работя в екип с друг и нещата са малки. |
|
| Автор: | relsys [ Пет Юли 20, 2018 11:16 pm ] | |||||||||
| Заглавие: | Re: атомични операции, fifo | |||||||||
Тук вместо #32, ще четеш по 4 байта от fifo-то. Щом са ти досатъчни, после можеш да си ги пишеш и побитово, където искаш. Прекъсване между 1-2 и 2-3 няма да навреди на тея 4 байта. |
||||||||||
| Автор: | Zdrav [ Пет Юли 20, 2018 11:45 pm ] |
| Заглавие: | Re: атомични операции, fifo |
аве, не изпадайте в заблуди и параноя. Ако някое прекъсване омаже в този момент регистрите то имаш друг проблем - с възстановяването на конктекста. Но по скоро те гони параноя някаква. При 32 битово МЦУ записа на променлива в паметта е atomic. Както t_i_t_o по-горе каза проблем може да има ако става въпрос за read-modify-write. |
|
| Автор: | woody [ Съб Юли 21, 2018 9:51 am ] | |||||||||
| Заглавие: | Re: атомични операции, fifo | |||||||||
Само ако е подравнена. |
||||||||||
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|