C optimalizalas
Fuzesi Arnold
arno at externet.hu
Fri Oct 28 01:45:33 CEST 2005
Szia!
Biztos vagyok, mert 8111 byte volt a kod, aztan elkezdtem kezzel
optimalizalni hogy beleferjek az atmega8-ba (kellet meg melleirni 1-2
dolgot), aztán csak nőtt a kódméret.
8127-ig vagymeddig felment.
Csak neztem furan... aztán a cross-call tunt ludasnak nezegetve a listat.
cfg.hangup_status sima uchar.
Listát küldhetek a kódról (de csak holnap, ma mar nincs hangulatom kibogozni
hol kezdodik az a reszlet), de vmi bűn randa :)
Max. optimalizacio van, meretre termeszetesen, 2 szintu cross-call-al.
Ilyen stílusu: (most csak beleollozztam talalomra...)
\ 00000676 01FC MOVW R31 : R30,R25 : R24
\ 00000678 5BE5 SUBI R30,181
\ 0000067A .... RCALL ??Subroutine36_0
\ ??CrossCallReturnLabel_232:
\ 0000067C 5BE5 SUBI R30,181
\ 0000067E .... RCALL ??Subroutine34_0
\ ??CrossCallReturnLabel_227:
\ 00000680 F421 BRNE ??main_88
\ 00000682 .... RCALL ??Subroutine27_0
\ ??CrossCallReturnLabel_170:
\ 00000684 8905 LDD R16,Z+21
\ 00000686 2300 TST R16
\ 00000688 F461 BRNE ??main_86
\ ??main_88:
\ 0000068A 01FC MOVW R31 : R30,R25 : R24
\ 0000068C 5AE0 SUBI R30,160
\ 0000068E .... RCALL ??Subroutine36_0
\ ??CrossCallReturnLabel_233:
\ 00000690 5AE0 SUBI R30,160
\ 00000692 .... RCALL ??Subroutine34_0
\ ??CrossCallReturnLabel_226:
\ 00000694 F009 BREQ $+2+2
\ 00000696 C079 RJMP ??main_83
\ 00000698 .... RCALL ??Subroutine27_0
\ ??CrossCallReturnLabel_171:
\ 0000069A A502 LDD R16,Z+42
\ 0000069C 2300 TST R16
\ 0000069E F409 BRNE $+2+2
\ 000006A0 C074 RJMP ??main_83
Arnold
----- Original Message -----
From: "Andras Tantos" <andras at tantosonline.com>
To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
Sent: Thursday, October 27, 2005 11:56 PM
Subject: Re: C optimalizalas
Hali!
Ez roppant erdekes. Ezek szerint az alabbi kod:
cfg.hangup_status=ACTIVE;
if(!cfg.out_type){
PORT3_OC1B=1;
}
else{
settimer(TMR_MONOSTABLE,cfg.out_type);
}
nagyobb kellene legyen, mint ez:
void SetHupStatusAct() {
cfg.hangup_status=ACTIVE;
}
....
SetHupStatusAct();
if(!cfg.out_type){
PORT3_OC1B=1;
}
else{
settimer(TMR_MONOSTABLE,cfg.out_type);
}
Biztos vagy ebben? Tudsz esetleg assambly listat kuldeni az (eredeti)
kodreszletekrol? Mi a tipusa a cfg.hangup_status-nak? Lehet, hogy 32-bites?
De meg ez se eleg magyarazat, ugy erzem... Meg azt tudom elkepzelni, hogy
valami csalafinta (bit-mezok, union) trukkozes miatt a ket kodreszlet meg se
egeszen ugyanazt csinalja.
Udv,
Tantos Andras
----- Original Message -----
From: "Fuzesi Arnold" <arno at externet.hu>
To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
Sent: Thursday, October 27, 2005 12:15 PM
Subject: C optimalizalas
Belefutottam egy jopofa dologba:
Az alabbi jocskan _rovidebb_ kodot eredmenyez:
if(!cfg.out_type){
PORT3_OC1B=1;
cfg.hangup_status=ACTIVE;
}
else{
if(cfg.out_retrigger){
settimer(TMR_MONOSTABLE,cfg.out_type);
cfg.hangup_status=ACTIVE;
}else{
settimer(TMR_MONOSTABLE,cfg.out_type);
cfg.hangup_status=ACTIVE;
}
}
mint ez:
cfg.hangup_status=ACTIVE;
if(!cfg.out_type){
PORT3_OC1B=1;
}
else{
settimer(TMR_MONOSTABLE,cfg.out_type);
}
Elvben funkcionalisan megegyeznek.
Csak egy jopofa pelda akart lenni, hogy forditok mennyire maskepp
gondolkodnak mint az ember, és bizonyos komplexitas felett mennyire nincs
eselyünk.
Azert lett rovidebb mert tök mashol hasznaltam azonos kodreszletet(ket),
amit a cross-call optimalizacio megtalalt, es csinalt egy par kis közös
fuggvenyt
Nezegettem a kodot, tele van cross-call hivassal... Nagyon ugyesen
megtalalja a kozos kodreszeket. Ott ahol nekem fel sem tűnne/
lustaságból/átláthatóság miatt nem kezdenék függvényhívást írni.
Arnold
-----------------------------------
Szponzorunk: http://tonerbolt.hu/
-----------------------------------
Szponzorunk: http://tonerbolt.hu/
More information about the Elektro
mailing list