WINAVR - prekvapiva optimalizace

Jaroslav Buchta jaroslav.buchta@gmail.com
Pátek Prosinec 12 10:41:36 CET 2008


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...)
------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://list.hw.cz/pipermail/hw-list/attachments/20081212/8e26338b/attachment-0002.htm 


Další informace o konferenci Hw-list