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