Optymalizacja w WinAVR i kod programu

Jun 16, 2010 8 Replies

WinAVR optymalizuje kod wynikowy za pomoca przelacznika -00,01,02,0s jak zrobiæ aby dany kawa³ek programu ¼ród³owego (w C) nie by³ optymalizowany np (to tylko przyk³ad)



void i2c_stop(void) { I2C_PORT|=1<<SCL; I2C_PORT|=1<<SDA; delay_hp(); // delay I2C_PORT&=~(1<<SCL); delay_qp(); // delay I2C_PORT&=~(1<<SDA); delay_hp(); // delay }



Zale¿y mi aby ustawiæ optymalizacjê na -0s ale wy³±czy³ z optymalizacji powy¿szy kawa³ek programu, lub np wy³±czy³ z optymalizacji ca³y plik ???


Dziêkuje za pomys³y



Tomek


__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5193 (20100613) __________



Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.



formatting link
lub
formatting link


TomZor pisze:

A dlaczego? Jeżeli optymalizacja coś psuje to jest raczej problem z błędnym kodem.

Każdy plik jest kompilowany osobno - w Makefile ustawiasz odpowiednie opcje dla tego pliku i już.

Skonfiguruj sobie to świństwo, żeby nie śmieciło na grupach.

TomZor pisze:

Trzeba dodać atrybut optimize do funkcji, która ma mieć inny poziom optymalizacji.

void my_function(void) __attribute__((optimize("O1"))) { [...] }

Z manuala do gcc:

optimize The optimize attribute is used to specify that a function is to be compiled with different optimization options than specified on the command line. Arguments can either be numbers or strings. Numbers are assumed to be an optimization level. Strings that begin with O are assumed to be an optimization option, while other options are assumed to be used with a -f prefix. You can also use the `#pragma GCC optimize' pragma to set the optimization options that affect more than one function. See Function Specific Option Pragmas, for details about the `#pragma GCC optimize' pragma.

Ja bym zaczął od znalezienia błędu w programie.

Dziêki za informacje

Program dziala poprawnie przy optymalizacji -00,01 dla pozosta³ych co¶ wycina albo robi po swojemu, prawdopodobnie kompilator wycina mi delay'e,

Ale dziêki

Tomek

Postaram siê "......ESET NOD32 Antivirus....." co¶ z tym zrobiæ

U¿ytkownik "Zbych" snipped-for-privacy@onet.pl napisa³ w wiadomo¶ci news:4c18bbc8$0$17086$ snipped-for-privacy@news.neostrada.pl...

__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5193 (20100613) __________

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

formatting link
lub
formatting link

TomZor pisze:

To oznacza, że źle te delaye napisałeś. Skorzystaj z tych wbudowanych w bibliotekę:

formatting link

Pokaż kod delay_hp().

Ale ... niech zgadnę ....

masz tam:

int i = 0; for( ; i < 100 ; i ++ )

jesli tak to zmien int i na:

volatile int i.

Nie, to nie jest dobre rozwiązanie, ale będziesz wiedział czemu Ci wycina.

Wszystko pieknie, zapomniales tylko napisac, ze tego atrybutu nie ma w gcc 4.3.x, ktory jest w WinAVR. A jesli Os cos knoci to znaczy, ze program jest do bani, a co jest do bani to juz napisales.

oto te delaye

#define n_hp 20 // 40 // fosc = 8Mhz #define n_qp 10// 20

void delay_hp(void) //hp - half i2c clock period delay normal: 5.0us { unsigned char time= 1+ (n_hp-7)/3; while(time--); }

void delay_qp(void) //qp - quarter i2c clock period delay normal: 2.5us { unsigned char time= 1+ (n_qp-7)/3; while(time--); }

Chodi o to ze program do obslugi i2c przy optymalizacji -00, 01 poprawnie kompiluje siê, nie ma ¿adnych problemów z dzia³aniem i2c. Natomiast przy pozosta³ych optymalizacjach juz odczyt zegarka po i2c a dok³adnie DS1307 nie dzia³a, wiêc mo¿e i mam ¼le co¶ napisane, ale skoro dzia³a przy - 00 i 01 to tak do koñca nie jest spaprane. ".....optimize("......." nie dzia³a w WinAVR, szkoda, ale zobacze co jeszcze co kompilator wywala przzy ró¿nych opcjach otymalizacji, bo mo¿e to nie wina procedur i2c ale gdzie¶ indziej...zobaczymy.

U¿ytkownik "T.M.F." snipped-for-privacy@nospam.mp.pl> napisa³ w wiadomo¶ci news:4c1c8b00$0$17099$ snipped-for-privacy@news.neostrada.pl...

__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5210 (20100619) __________

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

formatting link
lub
formatting link

__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow 5217 (20100622) __________

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

formatting link
lub
formatting link

TomZor pisze:

#define F_CPU 8000000 #include <delay.h>

void delay_hp(void) { _delay_us(5); }

void delay_qp(void) { _delay_us(2.5); }

Kompilować z optymalizacją. Przynajmniej te funkcje.

A to co napisałeś to przykład jak NIE pisać - kompilator zmieni sposób generowania kodu i się wszystko posypie.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required