Bu sorunun cevabi hangi Optimizasyon seviyesinde gizlidir?

Başlatan bunalmis, 09 Ocak 2011, 15:33:28

z

Cok iyi anlasilir bir program yazmak icin bol bol fonksiyon yazmak onemli.

Ornek vermek gerekirse; CPU daki USB cevre birimini Bus'a baglamak icin

Asagidaki fonksiyonu yazabiliriz.

void USB_On()
{
   USB_HWReg1 |= USB_OnBitSet;
}

Ayni sekilde USB yi devreden cikartmak icin

void USB_Off()
{
   USB_HWReg1 &= ~USB_OnBitSet;
}

Boylece Usb yi on yada off etmek icin ilgili fonksiyonu cagirmamiz yeterlidir.

Ornegin

void Usb_Init()
{
       Usb_On();
       ....
       ....
       ....
      if (err) Usb_Off();
}

Fakat burada cok basit fonksiyon olan Usb_On ve Usb_Off fonksiyonlarina muracat edildiginde sadece iki satir asm kod ihtiva eden bu fonksiyonlar, fonksiyon cagriminin dogasi geregi Call ve Ret islemlerine ihtiyac duydugundan 2 satirlik CPU islemi 4 satira firlamaktadir.

Bu fonksiyonlari #define ile tanimlamak cozum olmasina ragmen bunlari fonksiyon olarak birakip optimizasyon asamasinda basit fonksiyonlarin, cagrildigi C satirlari arasina sikistirilmasina izin veren optimizasyon olup olmadigini merak ediyorum.

yani kod derlendiginde asagidaki yapi gibi derlensin istiyorum.

void Usb_Init()
       // Usb_On();
       USB_HWReg1 |= USB_OnBitSet;
       ....
       ....
       ....
      // if (err) Usb_Off();
      if (err) USB_HWReg1 &= ~USB_OnBitSet;
}

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

controller

Bahsettiğiniz özellik "inline function" olarak geçer.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

strom

#define yerine inline kullanacaksanız, dosya uzantısını cpp yapmalısınız.Bu özellik (en azından Keild'de) sadece c++'da kullanılabiliyor.