RTV forum PL | NewsGroups PL

Jak wyłączyć optymalizację dla konkretnego fragmentu kodu w WinAVR?

Optymalizacja w WinAVR i kod programu

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wyłączyć optymalizację dla konkretnego fragmentu kodu w WinAVR?

TomZor
Guest

Wed Jun 16, 2010 10:48 am   



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.

http://www.eset.pl lub http://www.eset.com

Michoo
Guest

Wed Jun 16, 2010 11:15 am   



TomZor pisze:
Quote:
Zależy mi aby ustawić optymalizację na -0s ale wyłączył z optymalizacji
A dlaczego? Jeżeli optymalizacja coś psuje to jest raczej problem z

błędnym kodem.

Quote:
powyższy kawałek programu, lub np wyłączył z optymalizacji cały plik ???

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


Quote:

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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com

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


--
Pozdrawiam
Michoo

Zbych
Guest

Wed Jun 16, 2010 11:56 am   



TomZor pisze:
Quote:
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)

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.


Quote:
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 ???

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

TomZor
Guest

Wed Jun 16, 2010 12:05 pm   



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" <abuse@onet.pl> napisał w wiadomości
news:4c18bbc8$0$17086$65785112@news.neostrada.pl...
Quote:
TomZor pisze:
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)

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.


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 ???

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

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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com





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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com

Zbych
Guest

Wed Jun 16, 2010 12:11 pm   



TomZor pisze:
Quote:
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,

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

http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Sebastian Biały
Guest

Thu Jun 17, 2010 4:58 pm   



On 2010-06-16 14:05, TomZor wrote:
Quote:
Program dziala poprawnie przy optymalizacji -00,01 dla pozostaych co
wycina albo robi po swojemu, prawdopodobnie kompilator wycina mi delay'e,

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.

T.M.F.
Guest

Sat Jun 19, 2010 9:17 am   



Quote:
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)

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

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

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.


--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

TomZor
Guest

Sun Jun 20, 2010 8:34 am   



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." <tmf@nospam.mp.pl> napisał w wiadomości
news:4c1c8b00$0$17099$65785112@news.neostrada.pl...
Quote:
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)

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

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

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.


--
Inteligentny dom - http://idom.wizzard.one.pl
http://idom.sourceforge.net/
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com




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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com




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

Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.

http://www.eset.pl lub http://www.eset.com

Michoo
Guest

Tue Jun 22, 2010 8:05 pm   



TomZor pisze:
Quote:
oto te delaye

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

#include <delay.h>
Quote:


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_hp(void)

{
_delay_us(5);
}
Quote:

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

--
Pozdrawiam
Michoo

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wyłączyć optymalizację dla konkretnego fragmentu kodu w WinAVR?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map