-
1. Data: 2010-06-16 10:48:54
Temat: Optymalizacja w WinAVR i kod programu
Od: "TomZor" <t...@p...onet.pl>
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
-
2. Data: 2010-06-16 11:15:55
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: Michoo <m...@v...pl>
TomZor pisze:
> 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.
> 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ż.
>
> __________ 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
-
3. Data: 2010-06-16 11:56:13
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: Zbych <a...@o...pl>
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.
-
4. Data: 2010-06-16 12:05:11
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: "TomZor" <t...@p...onet.pl>
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" <a...@o...pl> napisał w wiadomości
news:4c18bbc8$0$17086$65785112@news.neostrada.pl...
> 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
-
5. Data: 2010-06-16 12:11:17
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: Zbych <a...@o...pl>
TomZor pisze:
> 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__ut
il__delay.html
-
6. Data: 2010-06-17 16:58:52
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: Sebastian Biały <h...@p...onet.pl>
On 2010-06-16 14:05, TomZor wrote:
> Program dziala poprawnie przy optymalizacji -00,01 dla pozosta?ych 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.
-
7. Data: 2010-06-19 09:17:31
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: "T.M.F." <t...@n...mp.pl>
>> 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.
-
8. Data: 2010-06-20 08:34:03
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: "TomZor" <t...@p...onet.pl>
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." <t...@n...mp.pl> napisał w wiadomości
news:4c1c8b00$0$17099$65785112@news.neostrada.pl...
>>> 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
-
9. Data: 2010-06-22 20:05:59
Temat: Re: Optymalizacja w WinAVR i kod programu
Od: Michoo <m...@v...pl>
TomZor pisze:
> oto te delaye
>
> #define n_hp 20 // 40 // fosc = 8Mhz
> #define n_qp 10// 20
#define F_CPU 8000000
#include <delay.h>
>
>
> 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);
}
>
> 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