Stránka 1 z 1

Deklarace proměnných v Atmel Studio

Napsal: 06 dub 2015, 23:37
od Jirka525
Ahoj, jsem drobet zmatený, jak Atmel studio pracuje s proměnnými. Potřeboval jsem deklarovat volatilní proměnné ve funkci. Udělal jsem to následovně:

char funkce1(parametry)
{
volatile char var1, var2;
char var3, var4;

kód funkce
return;
}

přičemž var1, var2 se chovají jako obyčejné lokální. Při zavolání funkce mají nulové hodnoty a nikoli hodnoty, které měly při předchozím ukončení "funkce1". Proměnné var3, var4 - tady jsem neměl ambice aby si pamatovaly hodnotu i po opuštění funkce. Stačilo by mě kdyby si pamatovaly hodnotu alespoň mezi první a poslední {}. Leč ani to se nestalo. Někdy v průběhu vykonávání kódu funkce1 také změní hodnotu. Jediné, co mě napadá, mám povolené přerušení. Jestli není možné, že při odskoku do přerušovací rutiny a návratu se nakopne zásobník?
Díky za radu

Napsal: 07 dub 2015, 00:59
od mtajovsky
Ohledně var1 a var2 je to správně a není to otázka Atmel studia, ale jazyka C. Vaše proměnné jsou automatické, alokované na zásobníku vždycky znovu po vstupu do funkce. Klíčové slovo volatile upozorňuje, že mohou být změněny i někde jinde a asynchronně a překladač nepoužívá ohledně nich optimalizaci do registru (když automatické proměnné nejsou jinde viditelné a tak to postrádá smysl). Pokud chcete, aby se hodnota proměnné zachovávala i mezi voláními funkce, musí mít třídu uložení (storage class) "static". Jestli mění samovolně hodnotu i ve funkci, bude to bug v programu (například přetečení pole na zásobníku). Proměnné var3 a var4 mohou být těžko měnitelné odjinud, protože nejdou odjinud viditelné.

Napsal: 07 dub 2015, 08:48
od Jirka525
mtajovský - děkuji za vysvětlení. Omlouvám se, použil jsem nesprávnou terminologii. Nepotřebuji tedy volatilní proměnné ale statické proměnné. Myslel jsem si, že volatilní proměnná a automaticky i statická. Večer to vyzkouším. Otázka tedy zůstává, co je špatně u proměnných var3, var4.