poradí někdo s OCD, aneb malá škola debugování

Zdravím vážení pánové,

potřebuji pro svůj projekt odladit část kódu co mi nefunguje a tak jsem se rozhodnul šáhnout po OCD avšak …

chtěl jsem se naučit na malém kódu jak v tom chodit, vše je dobré, vypnutá optimalizace zajistila že to chodí jak má až na jednu věc: vždy to vleze do funkce _delay_ms() z delay.h, a nejde z ní rychle vyskočit, neví někdo proč tomu tak je ? Je to způsobeno tím, že je delay částečně napsaná v asembleru ?

Jistě si každý dokáže představit co tento kód dělá, posouvá na portu a jedničku do prava, takže ledka jakoby jede v levo … Když začnu krokovat, tak všechno jede dle očekávání než se dostanu na ten delay, pak to skočí dovnitř a ven už nelze (step out)

#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>

void port_init()
{
	
	DDRA |= 0xff;
}


int main (void)
{
	uint8_t i = 0;
	port_init();
	
	PORTA = 0xff;
	while(1)
	{
		
		PORTA =0;
		PORTA |= (1 << i);
		i++;
		if(i>7) i = 0;
		_delay_ms(500);
		PORTA |= (1 << i);
	}
}
  1. Jakmile při simulaci přijdeš na řádek před delay() tak nastav kurzor na řádek za delay() a dej “Run to cursor”.
    Pak čekej. U mne trvá simulace 500ms asi 40 vteřin.

Nebo
2. Pro simulaci zakomentuj delay. Při vypnuté optimalizaci hodnota stejně nebude přesná.