C: premenne static

Jan Waclawek konfera na efton.sk
Pondělí Červenec 29 22:27:06 CEST 2024


[preposielam]

Ahojte,
chcel by som sa spytat tych znalejsich standardu C99 aky je rozdiel medzi
premnnymi v nasledujucich dvoch fragmentoch kodu. Ide o kompilator XC8 a
MCC-konfigurator. Pokial zapnem generovanie kodu a automaticky callback
rutiny pri TMR0, tak to vygeneruje nasledovny fragment kodu:

#define CALLBACK_COUNTER 10

void __interrupt TMR0_OverflowISR(void) {

static volatile unsigned char ISR_Counter = 0;

   if(++ISR_Counter >= CALLBACK_COUNTER) {
       CallBackRoutine();
       ISR_Counter = 0;
    }
}

Ja by som to napisal takto:

#define CALLBACK_COUNTER 10

volatile unsigned char ISR_Counter = 0;

void __interrupt TMR0_OverflowISR(void) {

   if(++ISR_Counter >= CALLBACK_COUNTER) {
       CallBackRoutine();
       ISR_Counter = 0;
    }
}

Viete mi prosim vysvetlit niekto aky je rozdiel v C99 v premennych raz
globalnych bez static a raz lokalnych s privlastkom static? Ako myslim, ze
som pochopil, ze ta static lokalna zostane "ziva" aj po opusteni rutiny
prerusenia, ale nie je mi to velmi jasne. Preto sa pytam. On totiz ten XC8
v2.46 je uz asi moc C99 kompatibilny a ja nie som az taky dobry programator
C, aby som jednotlive nuansy ovladal dokonale.

Velmi pekne dakujem za odpovede a vysvetlenie.

A.



Další informace o konferenci Hw-list