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