[elektro] STM32f4 interrupt : volatile tombok

hg12345 hg12345 at freemail.hu
Wed Dec 11 15:24:03 CET 2013


Hi,

Nem akarok kötözködni, de mi a feltételezés, hogy 11(12) általánosan használható regisztere van, vagy hogy egy méretes tömb nem fér bele. :-())) 

Már elnézést, de honnan gondolod, hogy egy méretes tömb minden elemét 11(12) regiszterben képes tárolni.
Persze ha ez egy semafor tömb, akkor és csak egy elemét használod akkor már más a felállás, de ez azért benne van az erediti mondatba :-)

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.

Gondolom láttál már asm listát ARM esetén és szintén megnézted az ARM "risc" utasítás készletét.
Ha igen akkor jól látható, hogy egy -O0 tömb címzés  esetén nagyon nagy százalékban ill. majdnem mindig végig csinálja a teljes eljárás, BASE + index*(sizeof()) ez azért barátok között is több elemi utasítás.
De ha kihasználja az ARM  index + offset & displacment utasítását egy lépésben sajnos ez se jelenti azt hogy egy utasítás egy óra ciklus, hanem inkább 6 belső óra ciklus. Az ARM utasítás készlet egy utasítás egy óraciklus csak a belső regiszter regiszter műveletekre vonatkozik, és még az se igaz hogy mindig ugyanannyi órajel alatt végzi el a műveletet. (Nagyon befolyásolja busz mátrix foglaltsága, és a CORTEX,  megvalósításoknál a belső buffer töltöttsége..., arról nem is beszélve hogy az egyes összetett elemi utasításokba még az IT is beférkőzik)  Persze erre már utaltam is, hogy az CORTEX magokon az ATOMIC utasítások nem megvalósíthatók, kivéve  BITBANDIG megvalósítást mert ezt belső 3 lépésből álló utasítás LOAD,XOR,STORE nem tudja megszakítani az IT, de ha tényleg akarod használni akkor a buffert a következő lépésben ürítésre kell kényszeríteni.

Az STM32F2 és F4 sorozatokban csak a uC kapcsolt ram olvasható 0.ws  ez egy 64K terület ami  kikerüli a buszmátrixot, és ha innen fut a program akkor 5-8% teljesítmény többletet lehet kihozni belőle a nem közvetlen kapcsolt ram a buszmátrix sebessége és a ram sebessége miatt lassabban olvasható.

Egyébként ha mindent volatile-nek definiálnak abból se lesz baj,  kicsit nagyobb és egy kicsit lassabb lesz a program de üzembiztosan fog futni. Az optimalizáslással buffer, tömb kezelés esetén azért 50% nagyobb teljesítmény javulás nehezen érhető el. HW <-> memória között sokkal célszerűbb a DMA gyorsabb, tisztább, érthetőbb.




"Móczik Gábor" <pm_levlista at progzmaster.hu> írta:
>2013.12.11. 9:39 keltezéssel, hg12345 írta:
>> Egy nagyméretű tömb esetén, ha nem csak egy elemét használod akkor ezt alapból nem tudja megcsinálni a forditó, nincs annyi regisztere :-)
>
>Ez azonban feltételezés.
>
>Ugyanis a fordítónak a tömb is csak egy ugyanolyan memóriaterület mint a 
>mondjuk a BSS szegmens, és egyszerre nem az egész tömbbel végzel 
>műveleteket, hanem egy elemmel. Ha olvasod és ugyanazzal a változóval 
>több műveletet végzel, valószínű hogy kiolvassa egy regiszterbe, és 
>onnan használja.
>
>Ennek van is értelme akkor, ha a RAM lassabb mint a CPU, vagy több 
>(nagyobb opcode) utasítás kell a címzéséhez. Ez mondjuk komolyabb 
>hardveren és/vagy CISC utasításkészletek esetén így is van, de az 
>STM32-ben egy ciklus alatt olvasható a RAM, ugyanolyan mintha 
>regiszterből olvasnád, semmi lassulást nem fog okozni ha volatile-ként 
>deklarálod.
>
>-----------------------------------------
>          elektro[-flame|-etc]
>



More information about the Elektro mailing list