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