arm cm3 dsb instrukce
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Pátek Červen 5 09:38:42 CEST 2020
Asi mate obecne pravdu ale u CM3 mi to moc smysl nedava. Volatile snad
zajistuje pristup pouze z hlediska prekladace, aby si nemyslel, ze se
promenna nemuze zmenit pokud ji vlastni kod v dane funkci nezmeni. Pokud
se pouzivaji zarovnane pristupy do 32b, tak se to predpokladam nemusi
resit vubec a 32b je bud zapsano komplet nebo vubec v okamziku
preruseni? Vsak je to provedeno jednou instrukci. A v opacnem pripade se
zakazuje preruseni komplet nebo castecne atp., v multitaskingu pouzivaji
sync objekty atd.
Funkce DSB je mi taky trosku zahadou, chapu to tak, ze to vysype ruzne
cache do fyzicke pameti a driv program nepokracuje, smysl to dava asi
hlavne u registru, kdy treba pri zmene 0-1-0 na nejakem GPIO by ke zmene
vubec nemuselo dojit? Pri cteni dat to mozna ma taky nejaky efekt i kdyz
tam spis vidim smysl ISB pokud se treba modifikuje kod.
U toho RESET to asi zajisti, ze v pameti budou ulozeny posledni zmeny co
program udelal.
Dne 05.06.2020 v 9:24 Miroslav Mraz napsal(a):
> Zběžné vysvětlení - pokud procesor používá pipeline, pak musíte ve
> vícevláknovém systému tuto nějak korektně "vysypat" pokud přistupujete
> ke sdílené proměnné. Jinak řečeno - pokud máte například globální
> proměnnou, kterou sdílíte mezi smyčkou hlavního programu a přerušením,
> nestačí jí deklarovat jako volatile, musíte použít něco jako
> std::atomic<type>. V čistém C je to složitější, viz
> https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
> nicméně i takto lze zajistit korektní volání toho dsb, aniž byste se
> musel starat o to jak a kdy.
> Atomický přístup k proměnné je hodně záludný, protože i když se na to
> vykašlete a necháte proměnnou jen jako volatilní, v naprosté většině
> případů to bude korektně fungovat. Jenže po dlouhé době vám začnou
> zákazníci nadávat a vy nebudete vědět proč. Nejhorší na tom je, že se
> bez toho moc nedá obejít, data mezi přerušením a programem je potřeba
> vyměňovat docela často. Sice se dá napsat fronta, která má jen 2 konce
> a bez atomického přístupu se obejde, ale je lépe si pamatovat, že něco
> jako atomický přístup existuje a gcc na to má svá primitiva.
>
> Mrazík
>
> Dne 05. 06. 20 v 6:59 Lubor Otta napsal(a):
>> Zdravím konféru,
>>
>> díval jsem se do knihovny na sysreset, tedy jak softem vyvolat reset
>> procesoru, dělá se to nahozením bitu SYSRESETREQ v registru SCB->AIRCR
>>
>> Donedávna jsem resetoval procesor zablokováním Wdogu.
>>
>> Zaujala mně instrukce DSB použitá pro jakousi synchronizaci. Můžete
>> mi někdo vysvětlit co ta instrukce provádí? Kde jinde by se hodila
>> použít?
>>
>> Lubor
>>
>>
>>
>> #define __DSB() __dsb(0xF)
>>
>> __STATIC_INLINE void NVIC_SystemReset(void)
>> {
>> __DSB(); /* Ensure all outstanding memory accesses included
>> buffered write are completed before reset */
>> SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
>> (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
>> SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group
>> unchanged */
>> __DSB(); /* Ensure completion of memory access */
>> while(1); /* wait until reset */
>> }
>>
>> /*@} end of CMSIS_Core_NVICFunctions */
>>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list