Отговори на тема  [ 33 мнения ]  Отиди на страница 1, 2, 3  Следваща
ARM мутекси, st32F4 __DMB() - как се ползва 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 695
Мнение ARM мутекси, st32F4 __DMB() - как се ползва
Чета това
https://developer.arm.com/documentation/dui0489/c/CIHGHHIE
пише, че __DMB() се отнася за предходната инструкция (вероятно машинен код)
и, защото не му разбирам, не ми е ясно как е правилното ползване на C.
Преди проверката на цикъла или след нея трябва да бъде?
Въобще, ще съм благодарен за всяка насока (и критика :) ) във връзка с организиране на нещо като mutex.

Код:
    int status = 0;
    do
    {
        while (__LDREXW( Lock_Variable) != ISF_MUTEX_UNLOCKED ); // Wait until Lock_Variable is free
        status = __STREXW( ISF_MUTEX_LOCKED, Lock_Variable ); // Try to set
        // Lock_Variable
    }
    while ( status!= 0 ); //retry until lock successfully

    __DMB();  // Do not start any other memory access
              // until memory barrier is completed
или
Код:
    int status = 0;
    do
    {
        while (__LDREXW( Lock_Variable) != ISF_MUTEX_UNLOCKED ); // Wait until Lock_Variable is free
        status = __STREXW( ISF_MUTEX_LOCKED, Lock_Variable ); // Try to set
        // Lock_Variable
      __DMB();  // Do not start any other memory access
    }
    while ( status!= 0 ); //retry until lock successfully

              // until memory barrier is completed


Сря Юни 16, 2021 12:14 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 8929
Местоположение: Добрич
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
За истински мютекс не ти трябва бариера. Само ексклузив достъп е достатъчен.

Бариерка може и да ти трябва ако смесваш нормален достъп и ексклузив, но не съм сигурен. Никога не съм правил подобна глупост и честно казано не знам. Всъщност донякъде може и да съм правил, някои от регистрите на STM са кофти. Примерно при старите GPIO няма как да клатиш или конфигурираш отделен пин по надежден начин. Но пък регистрите не са кеширани така че дори и да съм смесвал достъпи при тях пак няма нужда от бариери.


Сря Юни 16, 2021 12:36 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 695
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
miro_atc написа:
За истински мютекс не ти трябва бариера. Само ексклузив достъп е достатъчен...

Благодаря! От къде да прочета повече по темата? или някакъв промер?


Сря Юни 16, 2021 1:55 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 8929
Местоположение: Добрич
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Ако държиш да се образоваш трябва да изчетеш документацията на АРМ. Която е доста пръсната, отделно имаш референс манюал отделно още 100 pdf-a.
Почваш да ги сваляш в една папка и така... После трябва и чаршафите на ST-то да прегледаш, да се съобразиш коя памет в конкретния чеп каква е, дали е с кеш, дали е без.

Но за софтуера обикновено първо се преглеждат няколко готови реализации и съответно ти си вземаш мютекси или каквото ти трябва наготово. Само ако забележиш нещо прекалено съмнително или нещо те притеснява търсиш документации... Звучи непрофесионално, но и аз за много неща така процедирам напоследък ;-)


Сря Юни 16, 2021 3:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1920
Местоположение: Варна
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
memory barrier, mbar или msync се слага непосредствено преди освобождаването на мутекса. Когато мутекса се ползва от повече от едно ядро.
Което ако се съди по това "st32F4" в загланието на темата явно не е твоят случай.
Но пък ако разглеждаш имплементация на мутекс и там има mbar, провери дали не става въпрос за многоядрен процесор.
Но може пък някой също така да се е чесал по врата като е копирал код за мутекс от някъде и накрая да е оставил "една бариерка" ... Ей така против уроки :D

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


Чет Юни 17, 2021 10:07 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 9:32 pm
Мнения: 695
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Zdrav написа:
...Но може пък някой също така да се е чесал по врата като е копирал код за мутекс от някъде и накрая да е оставил "една бариерка" ... Ей така против уроки :D
уверих се, че е така :), благодаря :) !


Пет Юни 18, 2021 10:28 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 2531
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
"... Ей така против уроки ..."

например Microsoft на М0+
https://github.com/microsoft/uf2-samdx1 ... ain.c#L184

_________________
main[-1u]={1};
http://www.wizio.eu/


Пет Юни 18, 2021 3:35 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1920
Местоположение: Варна
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Ето едно четиво точно по темата:
https://developer.arm.com/documentation/dai0321/latest/

"4.19 Semaphores and Mutual Exclusives (Mutex) - unicore and multicore"
на стр. 49

Примерният код много прилича на постнaтият в началото на темата, но след това следват уточненията на следващата страница:
Цитат:
Implementation behavior
On microcontroller devices using the Cortex-M3 and Cortex-M4 processors, omission of the DMB
instruction in semaphore and Mutex operations does not cause an error. However, this is not
guaranteed if:
• the processor has a cache
• the software is used in a multi-core system.
ARM recommends that the DMB instruction should be used in semaphores and Mutex operations
in OS designs.
The Cortex-M0 and Cortex-M0+ processors do not have exclusive access instructions.


Не съм детайлно запознат с Cortex-M имплементациите, но би трябвало двойката ексклузивни load/store да минава покрай кеша.
Но от ARM и те са се застраховали и са използвали израза: "this is not guaranteed if...".
За повечето писачи на код това автоматично означава: "тури една бариерка да ти е мирна главата".

В същия pdf е писано и за това дали е нужна бариера между инициализацията и разрешаването на прекъсванията.
И пак тълкуването от писач на код в повечето случаи ще е в полза на "връзванетоначервенконец".
Но там това е бял кахър защото през бариерата се минава еднократно при стартиране. Докато мутекса може да се ползва често и всяко излишно изчакване да се мултиплицира.

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


Съб Юни 19, 2021 9:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 8929
Местоположение: Добрич
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
При М3 реализацията на LD/STEX е супер елементарна. Следи се само последователността, т.е. няма нищо общо нито с паметта, нито с кеша ако има такъв. Дори адресите да са различни (т.е. различни мютекси) пак гърми. Аз затова гледам да не ползвам ексклузив много-много в прекъсвания, защото отдолу се накъсва да цикли. Не знам при М4 дали са подобрили нещо, но дълбоко се съмнявам.
Така че при еднокуров чеп гарантирано няма смисъл от никакви червени конци. Въпросът е при многокуровите и като гледам че там слагат хардуерни мютекси си мисля, че там и конците не помагат. Не съм проверявал, но явно ексклузива е само в рамките на ядрото. Или поне не го свързват с другите ядра. И предвид това че екслузива не се интересува от памети и кешове, определено не върши никаква работа за мютекс между ядра. Някой ден ще го проверя, но почти съм сигурен че е така...


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

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1920
Местоположение: Варна
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
miro_atc написа:
... Въпросът е при многокуровите и като гледам че там слагат хардуерни мютекси си мисля, че там и конците не помагат.

Е, тя бариерата преди освобождаване на мутекса е за да се гарантира приключване на промените по ресурса който е защитен от мутекса. Не заради имплементацията на самият мутекс.
miro_atc написа:
...Не съм проверявал, но явно ексклузива е само в рамките на ядрото. Или поне не го свързват с другите ядра. И предвид това че екслузива не се интересува от памети и кешове, определено не върши никаква работа за мютекс между ядра. Някой ден ще го проверя, но почти съм сигурен че е така...

Днес проверих. Но не на Cortex, а на едно PPC. Но и при тях документацията е така написана, че при оптимистично четене на първи пас, оставаш с впечатлението, че двойката екслузив Load/Store върши работа и при повече от едно ядро.
Това вероятно е така, но само ако има имплементиран съответния external интерфейс, защото иначе reservation(така викат на екслузив двойката във PPC Вселената) си остава само за ядрото.
На всичко отгоре в многоядрено МЦУ, не всички ядра имат т.нар. reservation. В моя случай от три ядра едното няма, другите две имат, но нямат имплементиран съответния външен интерфейс за да може едното ядро да "разваля" reservation на другото ядро.
И там имплементацията е съвсем проста. Екслузив Load сетва бит в специален регистър на ядрото и този бит се сваля от всяка операция запис към цялото адресно пространство от съответното ядро. Екслузив Store проверява същият този бит и вдига флаг. И толкоз.

Така че Миро това което казваш го виждам макар и не за Cortex. Но стила на мъгляво писане на уж конкретна техническа документация е съшият. Вероятно и имплементацията при Cortex е подобна. - екслузив може да върши работа и при многоядрено МЦУ, но в повечето случаи нещо липсва.

Мутексите в многоядрения ОС, който ползваме на това PPC, са имплементирани с друг вид atomic операция - decorated storage :D
Погледнах имплементацията на мутекса в един от предните проекти, където ОС-а не са успели да го "направят" многоядрен - мутекса е с екслузив Load/Store. Съответно от две ядра едното стоеше в shutdown и другото беше натоварено като кираджийско магаре.

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


Пон Юни 28, 2021 5:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 8929
Местоположение: Добрич
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Zdrav написа:
Е, тя бариерата преди освобождаване на мутекса е за да се гарантира приключване на промените по ресурса който е защитен от мутекса.


Виж не бях се замислял за тая подробност щото не ми се е налагало ;-)


Вто Юни 29, 2021 9:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1920
Местоположение: Варна
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Загриза ме да задълбая едно-две нива по-надълбоко. И се оказа, че дори ако между ексклузив двойката Load/Store вмъкна нормален Store към същия адрес, виждам, че стойноста се променя, но ексклузив Store не се усеща и замазва отгоре стойноста която трябва да запише уж условно.
Т.е. в тази имплементация, която имаме при нас, освен че ексклузив двойката Load/Store не е multi-core ами осигурява atomic read-modify-write, само ако всички, които правят промени по дадения адрес от паметта, използват също ексклузив Load/Store.
В същото време "Programmer’s reference manual" е категоричен. В частта къде се описва как работи PPC варианта на ексклузив Store (store word conditional indexed - stwcx) дори не уточняват че е имплементационно зависим, а в прав текст говорят че други процесори или механизми(DMA?) могат да "развалят" reservation направен от ексклузив Load(load word and reserve indexed - lwarx).

В общия случай говорим за load-linked/store-conditional (LL/SC). А в конкретния за т.нар. weak LL/SC.
А моята мечта е формулирана като: transactional memory. И по-точно хардуерна имплементация на transactional memory.
Но изглежда, че това е препъни камък за големите батковци в хардуерния дизайн. Какво остава за ширпотребата, която ползваме.

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


Чет Юли 08, 2021 11:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 1:22 pm
Мнения: 6341
Местоположение: София
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Кое power ядро това? То си е неработене както го описваш. Имам под ръка G2LE ядро, не съм хващал подобно нещо и с предишното, но не съм и търсил.
Помня, че E6 ядрото им имаше някакво безумие, lwarx/stwcx според errata-та можеше да накара машината да увисне ако кодът забрави stwcx...
(За непознаващите power, тия инструкции са *user level*..... на времето това ме отказа от това ядро, инак му се облизвах преди 10-15 години).

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/s ... 228621276/


Чет Юли 08, 2021 5:22 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1920
Местоположение: Варна
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Ядрото е: e200z4
В ето това MCU: SPC58NN84

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


Чет Юли 08, 2021 5:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 1:22 pm
Мнения: 6341
Местоположение: София
Мнение Re: ARM мутекси, st32F4 __DMB() - как се ползва
Изтествах моето, работи според очакванията. По спомен писането няма особено значение къде е за да развали lwarx резервацията,
тествах го на съседния .l адрес. Очевидно адресът трябва да е в системната памет, ако минава през разни PCI-щини и подобни
няма как да работи. Обаче в твоето MCU трябва да си работи в RAM-а, не ми е ясно какво са си мислели, че правят.
Не съм има контакт с това баш ядро ама то това както спомена по-горе е общовалидно, чак ме накара да тествам това
с което живея в момента...


Прикачени файлове:
lwsttest.gif
lwsttest.gif [ 13.79 KiB | Прегледано 289 пъти ]

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/s ... 228621276/
Чет Юли 08, 2021 6:16 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 33 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

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


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

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