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