SORU
29 EKİM 2008, ÇARŞAMBA


Neden uçucu C Gerekli?

Neden volatile C Gerekli? Ne için kullanılıyor? Bu ne işe yarayacak?

CEVAP
29 EKİM 2008, ÇARŞAMBA


Uçucu söyler uçucu değişken ile ilgisi var bir şey optimize etmek için değil, derleyici.

Orada kullanmak için tek nedeni var: ne Zaman donanım ile arabirim.

Hadi RAM bir yere eşleştirilen iki adresi olan donanım bir parça var ki: bir komut bağlantı noktası ve veri portu:

typedef struct
{
  int command;
  int data;
  int isbusy;
} MyHardwareGadget;

Şimdi bazı komut göndermek istediğiniz:

void SendCommand (MyHardwareGadget * gadget, int command, int data)
{
  // wait while the gadget is busy:
  while (gadget->isbusy)
  {
    // do nothing here.
  }
  // set data first:
  gadget->data    = data;
  // writing the command starts the action:
  gadget->command = command;
}

Kolay görünüyor, ama derleyici veri ve komutları yazılır sırasını değiştirmek için ücretsiz çünkü başarısız olabilir. Bu küçük gadget veri değeri önceki ile komutlar vermek için neden olur. Ayrıca meşgul döngü sırasında bekle bir göz atın. Bir optimize edilmiş olacak. Derleyici zeki, ısbusy değeri sadece bir kez okumak ve sonsuz bir döngüye gidin deneyin. İstediğin bu değil.

Bunu aşmanın yolu geçici olarak işaretçi aracı ilan etmektir. Bu şekilde derleyici yazdığın şeyi yapmak zorunda kalır. Bellek atamaları kaldıramadığını, kaydeder değişkenleri önbelleğe değil ve atamaları sırasını da değiştirebilirsiniz.:

Bu doğru sürüm değil

   void SendCommand (volatile MyHardwareGadget * gadget, int command, int data)
    {
      // wait while the gadget is busy:
      while (gadget->isbusy)
      {
        // do nothing here.
      }
      // set data first:
      gadget->data    = data;
      // writing the command starts the action:
      gadget->command = command;
    }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jack Vale Films

    Jack Vale Fi

    8 ŞUBAT 2007
  • Julia Graf

    Julia Graf

    6 Mayıs 2006
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006