Atmel Studio
Moderátor: Moderátoři
Atmel Studio
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
#include <knihovny>
.
.
.
unsigned int a,b;
a=1;
b=2;
.
.
.
.
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, ESP8266, STM32, ESP32...)
Peťus
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í.