Shadow registers

En algunes arquitectures i en perifèrics d’alguns fabricants poden llegir que es fan servir shadow registers. S’anomenen així a registres que contenen una còpia d’un altre registre i que son els que es poden llegir per part d’altres dispositius o perifèrics.

Així per exemple, trobem shadow registers} a alguns processadors de manera que quan la CPU entra a una interrupció es passa a treballar amb un banc separat de registres de propòsit general. Això es fa per evitar un sobrecost a la crida de la ISR, ja que si es tenen aquests registres s’han de guardar els valors actuals de tots els registres a la pila abans de poder executar el codi de la ISR. En canvi, si es tenen aquests registres, la CPU passa a treballar amb un banc diferent (els shadow registers) durant l’execució de la ISR i no cal salvaguardar cap valor dels registres originals. Un cop se surt de la ISR la CPU torna a treballar amb el banc de registres originals. En el cas dels Cortex-M no es treballa amb aquesta mena de shadow registers i, per tant, caldrà que les ISR salvin els valors dels registres de propòsit general que sobreescriguin durant la seva execució.

Una altra lloc on ens podem trobar shadow registers és en alguns perifèrics que treballen valors grans repartits en diversos registres. Si aquests registres s’actualitzessin entremig d’una lectura per part del Firmware, aquest podria tenir una inconsistència a les dades. Per això, és habitual que un valor determinat s’emmagatzemi a shadow registers mentre els registres “amagats” s’actualitzen de forma normal. Aquests shadow registers seran els que el firmware pot llegir i s’actualitzaran tots de cop una vegada s’hagin llegit tots pel firmware.

A tots ens ha passat o tenim un company que ha perdut una tarda sencera intentant llegir uns registres d’aquesta mena sense seguir bé l’ordre i rebent valors dolents sense caure en el problema amb els shadow registers.

Un exemple d’això últim succeeix amb els registres de data i temps del RTC dels microcontroladors d’ST (veure RTC). Aquest perifèric conté uns shadow registers on es copien cada 2 cicles els registres reals amb la data, el temps i els segons del RTC (veure la Figura). Quan es llegeix el registre amb el temps o amb els segons es bloqueja la còpia de tots els tres registres perquè la lectura dels demès no doni cap incoherència. Si no hi fossin, podria passar que es llegís el temps (per exemple les 23:59:59 del dia 1) i poc després al llegir la data ja hagués passat el segon i la data ja fos el dia 2, resultant en que enlloc de llegir les 23:59:59 del dia 1 s’hauria llegir les 23:59:59 del dia 2. En aquest cas sembla que és molt millor llegir la data i que es tingui un error d’un segon a tenir un dia sencer d’error (!).

Shadow registers del perifèric RTC dels STM32

Per tant, en aquest perifèric, primer cal llegir el registre amb el temps o els segons i després el registre amb la data. Així si només es vol llegir el temps del RTC perquè no interessa la data del sistema, no es poden fer lectures consecutives del temps sense llegir també, encara que no interessi, la data del RTC. La API del fabricant en aquest cas no ho gestiona, però si que ho adverteix a la seva documentació.

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.