arm cm3 dsb instrukce

Miroslav Mraz mrazik na volny.cz
Pátek Červen 5 09:24:00 CEST 2020


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 */
> 


Další informace o konferenci Hw-list