neocekavane chovani cyklu for - problemy s optimalizaci ?

Zdravim, pracuji v avr studiu 4 a zlobi me nasledujici kod

while(1){
jj = 0;
for(ii = 0; ii < 5; ii++){
.
.
.
jj = jj + 2;
}
}

V simulatoru se mi promenna jj po kazdem pruchodu for vynuluje, coz je podle me spatne, muze za to nejaka optimalizace? Diky

Zkoušíš to krokováním v debuggeru? Je-li zapnuta optimalizace, mohou nesouhlasit čísla řádků a vede Tě to po jiných řádcích než se provádí, či spíš přesněji kód se při optimalizaci vykonává v jiném pořadí než ve zdrojáku a některé části může překladač vypustit když zjistí že se dají udělat jednodušeji.

Měl bys ladit nejdříve s vypnutou optimalizací a až po odladění ji zapnout a jen zkontrolovat funkčnost kódu (už bez debuggeru - nebo sice krokovat, ale v assembleru).

Ano v debugeru, z konce foru to skoci na zacatek (= for(ii; ii<5; ii++)), pak krok zpet na jj=0, po te zase do foru

Jo, tak to je kvůli optimalizaci, debugger nemá pro kód rozumný řádek. Ve skutečnosti to j=0 neprovádí, jen neví co má pro dané místo programu ukázat - dá se to zkontrolovat v assembleru. Při optimalizaci často ani obsahy proměnných nesouhlasí, protože procesor má proměnné např. v registrech a ty používá vícenásobně a tak debugger neví co má zobrazovat.

Podívej se sem
ebastlirna.cz/modules.php?na … ic&t=58236

jde o to, ze jj urcuje radek pameti a kdyz se po kazdem pruchodu forem jj vynukuje, tak se mi nevysle dalsi hodnota z pameti…zkusil jsem to ted naprogramovat a na displej mi to vypisuje stale jednu hodnotu, tu prvni, protoze jj je stale 0

Zkus takto

[code]volatile uint8_t jj, ii;

int main(){

while(1)
{
jj = 0;

for(ii = 0; ii < 5; ii++)
{
jj = jj + 2;
}
}[/code]

nepomaha :frowning:

juraw spíš uveď větší kus kódu, zřejmě bude chyba někde jinde, protože kód co jsi uvedl vypadá být v pořádku a neměl by jj nulovat. (volatile by zde nemělo být nutné použít) Zkusil jsi to bez optimalizace? Možná si jen myslíš že jj se nuluje a nefunguje Ti kód z nějakého jiného důvodu.

[code]

volatile unsigned int jj;
unsigned int ii,i;
char buffer[10];
double pom,uhel;

int main( void )
{
uint8_t *mem = malloc(BUFFER_SIZE);
.
.
.
jj = 0;

for (ii = 0; ii < 5; ii++){
  pom = sin(data);						//pom je typu double

  output_data = (unsigned int) ((pom + 1) * 10000 * 3.2768); 		//prevod double na u int - rozsah 0000 az FFFF
  
  horni_bajt = (output_data >> 8) & 0x00ff;							//horni a spodni uint_8
  mem[jj] = horni_bajt;
  spodni_bajt = output_data & 0x00ff;
  mem[jj+1] = spodni_bajt;
  
  jj = jj + 2;
  data = data + 1.57;
}


   while (1){	
  jj = 0;
  for(ii = 0; ii < 5; ii++){
	horni_bajt = mem[jj];
	spodni_bajt = mem[jj+1];
	jj = jj + 2;

        output_data = spojeni(horni_bajt,spodni_bajt);
    
	lcd_gotoxy (0,2);
        sprintf(buffer, "data do DAC: %d", output_data);
        lcd_puts(buffer);	  

        DAC_WRITE(2, output_data);		

   // _delay_ms(250);
  }	  
}

while( 1 ){
}
return( 1 );
}[/code]

Výstup na displej je moc rychle, pak tam může být viditelná jen jedna z hodnot. Když odkomentuješ to _delay_ms(250) nemění se to ani tak? Na zkoušku bys mohl na displeji namísto output_data zobrazovat hodnotu ii, tím bys viděl zda je chyba v zobrazování (ii se musí měnit - pokud ne tak např. program zamrzá v nějaké funkci např. sprintf) nebo v přípravě dat.

ten delay mam zakomentovany jen kvuli debugeru, zkusim teda vypisovat jeste hodnotu ii a jj, diky

Chyba je tom že máš deklarovaný malý “buffer”.

char buffer[10]; ... ... sprintf(buffer, "data do DAC: %d", output_data);

PS:
Proč tady používáš malloc?
A když už ho použiješ, tak bys měl testovat jestli se alokace podařila.

Wow! Diky moc, opravdu, kdyz jsem zvetsil buffer tak se to chova spravne… malloc jsem pouzival, protoze jsem potreboval alokovat vetsi pamet na vzorky, testovat, jsem ho testoval, jen jsem to asi nezkopiroval