arm cm3 dsb instrukce
Jan Waclawek
konfera na efton.sk
Pátek Červen 5 09:38:42 CEST 2020
Aby sa procesor nezdrziaval zapismi do potencionalne pomalej pamate alebo
periferie, pri zapise pouzije buffer na vystupe, do ktoreho sa zapisovane
slovo+adresa ulozia do doby, kym sa prislusna zbernica/periferia uvolni a
umozni zapis. Program v procesore pritom bezi dalej, v tomto pripade
vratane zapisu do vnutorneho registra procesora, ktory sposobi reset.
Instrukcia DSB (Data Synchronization Barrier) sposobi, ze sa vykonavanie
programu pozastavi az do doby, kym sa zapisovy buffer nevyprazdni. V tomto
pripade je cielom to, aby sa zabezpecilo, ze sa vsetky zapisy ukoncia,
t.j. ak sa tesne pred volanim NVIC_SystemReset zapisuje do pamate, ktora
Ta instrukcia ma o chlpok sirsi zaber u zlozitejsich (superskalarnych)
procesorov, resp. u procesorov, ktore preusporiadavaju zapisy na vystupe,
pripadne maju viacere alebo rafinovanejsie zapisove buffre; ale u
Cortex-M3 toto nehrozi. Princip je vsak stale rovnaky, ide o to, aby
vsetky vplyvy na vonkajsie pamate (vratane periferii), tych instrukcii,
ktore boli vykonane pred DSB, bol v okamihu za vykonanim DSB ukoncene.
Vacsinou sa popisuje to, co ta instrukcia robi; ale asi dolezitejsie je si
uvedomit najma to, co vsetko ta instrukcia nerobi. Po prve, DSB nijako
nezabezpecuje dianie mimo procesora. To je dolezite si uvedomit prave u
Cortex-M procesorov, kde typicky su periferie "zavesene" na pomocnej APB
zbernici, a medzi hlavnou AHB a relativne pomalou pomocnou APB zbernicou
je dalsi buffer, ktory sice pomaha rychlosti vykonavania (vdaka nemu je
mozne zapisat na rozne APB zbernice tesne po sebe), ale do tychto buffrov
uz procesor "nevidi". Tu, ak je potrebne zabezpecit, ze sa zapis skutocne
uskutocnil t.j. ze sa buffer v AHB/APB mostiku vyprazdnil, je potrebne bud
jednoducho pockat (bohuzial obvykle nezdokumentovanu a aj obtiazne
dokumentovatelnu dobu), alebo asi lepsie, z danej periferie spatne
precitat zapisanu hodnotu.
O nieco horsie su signaly, ktore prechadzaju cez rozne synchronizatory,
ktore sposobuju oneskorenia, ktore su este menej zdokumentovane (citaj:
vobec) a este obtiaznejsie presne specifikovatelne. Toto sposobuje
napriklad notoricky "problem" na tychto mcu, kde pri vymazani zdroja
prerusenia tesne pred koncom prerusovacej rutiny nastava znovavyvolanie
prerusovacej rutiny bez zjavnej priciny
http://efton.sk/STM32/gotcha/g7.html . Znova, tu DSB vobec nepomoze, resp.
niekedy pomoze ale nechtiac, jednoducho tym, ze vykonanie DSB je
instrukcia (mimochodom, kvoli tomuto je aj vhodnejsie v kratkych cakaniach
pouzit DSB miesto NOPu, kedze u mierne rafinovanejsich procesorov moze
nastat odstranenie NOPu z toku vykonavanych instrukcii uz v prefetch
jednotke, t.j. sa do vykonavacej fazy ani nedostanu).
No a DSB samozrejme funguje len na ukoncenie efektu instrukcii, ktore
procesor vykonal, t.j. tych, ktore su v strojovom kode. Toto je dolezite
povedat kvoli tomu, lebo vacsina programov je pisanych vo vyssich jazykoch
(typicky C), ktore mozu v ramci optimalizacie preusporiadat vykonavanie
prikazov do ineho nez "napisaneho" poradia. Tu je klucom klucove slovo
volatile, avsak v praktickych programoch je neprakticke premenne v
"beznej" pamati oznacovat ako volatile, a kedze pre C ako jazyk je osud
premennych v pamati uplne lahostajny, tak musia nastupit prostriedky, tiez
nazyvane "pamatova bariera", ktore nie su standardne a su pre kazdy
prekladac specificke, ktorymi sa zabezpeci, ze prekladac ukonci vsetky
zapisy do vsetkych pamati do bodu, kde je pamatova bariera uplatnena.
Vo svetle horeuvedeneho je pouzitie tej instrukcie v tejto funkcii tak
trochu naivne, ale je to funkcia ktoru priamo napisal ARM, a su to prave
oni co "nevidia" za "hranice" "svojho" procesora.
https://developer.arm.com/docs/dai0321/latest
wek
----- Original Message ---------------
Subject: arm cm3 dsb instrukce
From: Lubor Otta <butan at centrum.cz>
Date: Fri, 5 Jun 2020 06:59:20 +0200
To: HW-news <hw-list at list.hw.cz>
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 pouitá 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 at list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list