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