problem s optimalizaci v avr-gcc

Jakub Ladman ladmanj@volny.cz
Úterý Prosinec 27 12:44:28 CET 2005


Muzete mi nekdo prosim vysvetlit co delam spatne ze mi v nasledujici funkci 
vygenerovany kod vesele ignoruje argument UI8 pocet (a mozna i jine, ale to 
nevim), pokud jej nepouziju v umele vlozenem sprintf.
Pokud ten sprintf zakomentuju, nefunguje to, pokud tam je, funguje to.
Funkci vraci soucet teto promenne s jeste jednou a pokud je sprintf 
zakomentovany v te navratove hodnote je nesmysl.
Napsal to kolega programator pro PC a ja jsem to pouze prepisoval pro pouziti 
v AVRku.
Horsi je ze v puvodni forme jsem to uspesne prelozil pod gcc pro linux a pod 
avr-gcc to dela hovadiny. Nechapu.

Umite to nekdo vysvetlit?
Diky
Jakub Ladman

UI8 Data_najdi_znacku(UI16 od, UI8 pocet,UI8 *vysledek_nazvy,UI8 
*vysledek_index, UI16 *dalsi)
{
UI16 i3 = 0,i4 = 0;
UI8 ret = 0;
UI32 a;
UI16 e;
UI8 *p;
UI16 w1,w2;
UI8 x;
UI32 p_to_flash;

*dalsi = 0;
char txt[30]="";
sprintf(txt, "d=%u\r\n", pocet);
//usart0_puts(txt);

 if (od >= met_index1i) return 0; // nejsou dalsi
 while((ret < pocet) && (od + ret < met_index1i))
	{
	e = (UI16)(od+ret)*8;
   	e += (UI16)met_index1;
   	p = (UI8*)e;
   	a = *(UI32*)p;

   	p_to_flash = met_data+a;

   	flash_array_read(p_to_flash, 1, &x); //delka textu znacky
 
   	flash_array_read(p_to_flash+1, x, &vysledek_nazvy[i3]);

   	i3 = i3+x;
   	vysledek_nazvy[i3] = 0x00;
   	i3++;

   	p = (UI8*)(e+4);
   	w1 = *(UI16*)p;

   	p = (UI8*)(e+6);
   	w2 = *(UI16*)p;

   	*(UI32*)&vysledek_index[i4] = a;
   	*(UI16*)&vysledek_index[i4+4] = w1;
   	*(UI16*)&vysledek_index[i4+6] = w2;

   	i4+= 8;

   	ret++;
 	}

  *dalsi = od + pocet;
  if (od >= met_index1i) *dalsi = 0;
  return ret;
}



Další informace o konferenci Hw-list