[elektro] STM32f4 interrupt : volatile tombok

Pal Lukacs ekegep at yahoo.com
Thu Dec 12 15:38:03 CET 2013


Sziasztok !

Ujra interrupt problemaba utkoztem.

Ha az 1ms systick IT-be beteszek egy ilyen apro kodot, egyszeruen meghulyul a DAC (discovery karrtya) Mintha maximum hangero hangerot allitana be neki, maximum hangerovel szol (zaj)

Hm.

switch ( check_encoder() ) {

             case LEFT:
 
               freq-=1000;
                 sprintf((char*)buf, "DDS f:  %8ld", freq);
               print_2line_addr=1;
                break;

             case RIGHT:

              freq+=1000;
                 sprintf((char*)buf, "DDS f:  %8ld", freq);
               print_2line_addr=1;
                break;

             case WAITING:
                default:
        //        wait = 0;
                break;                     
            }

Mi a csoda lehet ?

Udv.
Szabi






On Thursday, December 12, 2013 10:13 AM, hg12345 <hg12345 at freemail.hu> wrote:
 
....
Más szavakkal ismétled amit írtam.


"Móczik Gábor" <pm_levlista at progzmaster.hu> írta:
>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.
>
>-----------------------------------------
>          elektro[-flame|-etc]
>

-----------------------------------------
          elektro[-flame|-etc]


More information about the Elektro mailing list