[elektro] STM32f4 interrupt : volatile tombok

Móczik Gábor pm_levlista at progzmaster.hu
Wed Dec 11 19:09:57 CET 2013


2013.12.11. 15:24 keltezéssel, hg12345 írta:
> Ha igazad lenne és a fordító nem változó alapon dolgozna fordítási egységenként, hanem memória alapon, ami eléggé lehetetlen, mert ezt a linker csinálja, akkor nem kéne a volatile-vel foglalkozni, mert látná hogy ennek máshol is értéket adnak.

A fordító bizonyára látja hogy máshol is értéket adtak, bizonyára azt 
is, hogy ez az ISR-ben történt. A volatile nem azért kell, mert a linker 
össze-vissza keveri a dolgokat.
Azért kell, mert a fordító nem tudhatja, hogy ezek a valóságban a valós 
hardveren a valós események között egymást megszakítják-e majd, azt sem 
tudja, hogy ha netán igen, építettél-e be védelmet (szemafor, mutex, 
stb.) erre az esetre.
Azt sem tudja, hogy mondjuk egy abszolút címre deklarált változó RAM-ba 
esik-e egyálalán vagy MMIO területre, és változik-e a háttérben.

Ezért kell neked megmondani, mert te ismered az egész rendszert.

A relokációról:

A fordító memória szegmens alapon dolgozik!

A linker nem dolgozik változókkal, nem rak minden egyes változót 
akárhová, nem is tudja milyen változók vannak. A fordító szépen sorban 
lepakolja az aligning figyelembevételével a változókat egy szegmensbe.
A linker utána a komplett szegmenst relokálja, a linker scriptben 
megadott utasítások szerint.

Például ha megnézel egy startup kódot, látható, hogy a zero init 
változókat egy ciklusban tölti fel, a kezdőértékkel inicializáltakat meg 
egy másik szegmensből másolja át. Ez aligha működne, ha a linker 
szanaszét rakosgathatná a változókat, és akkor is aligha működhetne, ha 
a compiler nem tudná már fordítási időben hogy azoknak sorban kell 
lennie a memóriában...

Ha deklarálsz egymás után egy int változót meg egy int tömböt, majd 
megnézed a generált adatszegmenst, látni fogod, hogy ott is igen jó 
eséllyel egymás után vannak.
Ha írsz pár utasítást ami *i majd *(t-1), t[58] majd *(&i+59), látható 
lesz, hogy igen erősen azonos jellegű kódot fog generálni hozzá, semmi 
speciális nem fog történni attól hogy a tömböt vagy az előtte lévő 
változót címzed.



More information about the Elektro mailing list