Stránka 1 z 1

Atmel Studio

Napsal: 24 kvě 2013, 21:50
od Jirka525
Ahoj rád bych začal pracovat v AtmelStudiu ale hned 1. nesmělý pokus skončil fiaskem. Pokusil jsem se přeložit následující program

int main(void)
{
a = 1;
b = 2;
while(1)
{
a=a+1;
b=b+a;
}
}

Kompilátor to přeložil následujícím způsobem

{
a = 1;
00000025 LDI R24,0x01 Load immediate
00000026 LDI R25,0x00 Load immediate
00000027 STS 0x0103,R25 Store direct to data space
00000029 STS 0x0102,R24 Store direct to data space
b = 2;
0000002B LDI R24,0x02 Load immediate
0000002C LDI R25,0x00 Load immediate
0000002D STS 0x0101,R25 Store direct to data space
0000002F STS 0x0100,R24 Store direct to data space
00000031 RJMP PC-0x0000 Relative jump
--- No source file -------------------------------------------------------------
00000032 CLI Global Interrupt Disable
00000033 RJMP PC-0x0000 Relative jump

Docela mě překvapilo, že si neláme hlavu s nekonečným cyklem While(1) a hrubě z toho udělá na adrese 31 RJMP PC-0. Tělo cyklu zmizelo.
Když z nekonečného cyklu udělám konečný například While( a < 10), tak to přeloží správně.
Napadá někoho, co je špatně?
díky Jirka

Napsal: 24 kvě 2013, 23:15
od petus
atmel studio zrovna u sebe nemám, ale...
#include <knihovny>
.
.
.
unsigned int a,b;

a=1;
b=2;
.
.
.
.

Napsal: 24 kvě 2013, 23:54
od kulikus
Vypni optimalizaci.

Napsal: 25 kvě 2013, 08:37
od AB1
Gcc je silně optimalizující překladač.
Ve smyčce while vidí, že nastavíš proměnné "a" a "b" na nějaké hodnoty, ale dál už tyto proměnné nejsou použité. Takže kód ve while() nemá smysl a optimalizátor ho odstraní.

Optimalizaci neypínej.
Pro testování deklaruj proměnné jako

Kód: Vybrat vše

volatile unsigned int a, b;

Kvalifikátor volatile říká překladači, že proměnná může být použita (změněna) i někde jinde než v hlavním programu (např. v přerušení).
Proto kód ve while() neodstraní.

Napsal: 25 kvě 2013, 19:16
od Jirka525
Ahoj díky za radu. Pochopitelně jste měli pravdu oba. Vyzkoušel jsem obě metody, tj. vypnout optimalizaci i deklarovat proměnné a,b s kvalifikátorem "volatile". V obou případech se překlad provedl dle mých představ. Tedy i s tělem cyklu While(1)