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