WINAVR - prekvapiva optimalizace

Jaroslav Buchta jaroslav.buchta@gmail.com
Pátek Prosinec 12 11:56:06 CET 2008


No, ja uz se naucil I 3. pravidlo, ze zadny prekladac neni dokonaly a obcas
neco prelozi I uplne blbe :-) Zvlast tem pro MCU neverim dokud preklad
nevidim.
A kratsi jsem myslel na pocet instrukci, tady neni rychlost dulezita. Ale I
na rychlost by to IMHO vyslo podstatne lepe s pouzitim promenne typu BYTE
pro pocitani iteraci cyklu. Adresa by se jen pricitala, nemusela by se
porovnavat v 16b forme a pripravovat koncova adresa dalsimi x instrukcemi.
Takze v tomto pripade optimalizaci nepovazuji za zdarilou.

-----Original Message-----
From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On
Behalf Of Marek Sembol
Sent: Friday, December 12, 2008 10:58 AM
To: HW-news
Subject: Re: WINAVR - prekvapiva optimalizace


Čo si také predstavítě pod pojmom "kratsí", Kefalín?
Kratsi == mene bytu nebo kratsi == rychlejsi vykonani (kratsi cas)?

Prvni co by se mel clovek u C naucit je to, ze s dnesni urovni prekladacu a
optimalizace je naprosto zbytecne naznacovat 'jak ma neco prelozit' To co
prekladac provedl je mimochodem ucebnicova ukazka optimalizace cyklu.
Prekladac si sam rozhodne zda nejakou promennou vynecha (ci si pripadne
prida vlastni pomocnou)

Navic kdyz uz chcete prekladaci naznacovat, naznacujte lepe:
   for (idx=DsTSensCount; idx != 0; idx--)
   {
    pd++->status = TSENS_ERR_HW;
   }

S pozdravem
Marek
PS: hned druhe co by se clovek mel naucit, ze se s optimalizaci ne vzdy
rozhodne spravne:)


On Fri, Dec 12, 2008 at 10:41 AM, Jaroslav Buchta
<jaroslav.buchta@gmail.com> wrote:
> Zdravim,
> ted me dostala optimalizace casti kodu, kterou jsem necekal...
>
>    BYTE idx;
>    PDS18X20_DESC pd = &DsTSensDesc[0];
>    for (idx=0; idx<DsTSensCount; idx++)
>    {
>     pd++->status = TSENS_ERR_HW;
>    }
> je prelozeno takto:
>
>    BYTE idx;
>    PDS18X20_DESC pd = &DsTSensDesc[0];
>    for (idx=0; idx<DsTSensCount; idx++)
>  bee: 90 91 78 02  lds r25, 0x0278
>  bf2: e0 e0        ldi r30, 0x00 ; 0
>  bf4: f2 e0        ldi r31, 0x02 ; 2
>  bf6: 8c e0        ldi r24, 0x0C ; 12
>  bf8: 98 9f        mul r25, r24
>  bfa: c0 01        movw r24, r0
>  bfc: 11 24        eor r1, r1
>  bfe: 8e 0f        add r24, r30
>  c00: 9f 1f        adc r25, r31
>    {
>     pd++->status = TSENS_ERR_HW;
>  c02: 21 e0        ldi r18, 0x01 ; 1
>  c04: 02 c0        rjmp .+4       ; 0xc0a <TSens_SrvFunc+0x46>
>  c06: 23 87        std Z+11, r18 ; 0x0b
>  c08: 3c 96        adiw r30, 0x0c ; 12
>   wStartTicks = GetTicks1ms();
>   if (bRes != DS18X20_OK)
>   {
>    BYTE idx;
>    PDS18X20_DESC pd = &DsTSensDesc[0];
>    for (idx=0; idx<DsTSensCount; idx++)
>  c0a: e8 17        cp r30, r24
>  c0c: f9 07        cpc r31, r25
>  c0e: d9 f7        brne .-10      ; 0xc06 <TSens_SrvFunc+0x42>
>  c10: 30 c0        rjmp .+96      ; 0xc72 <TSens_SrvFunc+0xae>
>
> (prolozeni textu je trosku ujete, pointa je v tom, ze se prekladac 
> uplne vyhne pouziti promenne idx a ukonceni cyklu provede na zaklade 
> porovnani ukazatele na strukturu s max. hodnotou (pocet polozek je na 
> adrese 0x278) Je to evidentne funkcni a logicke, rekl bych ale, ze s 
> pouzitim idx by kod vysel kratsi, coz byl muj zamer...) 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list