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

  • boogie2988

    boogie2988

    6 NİSAN 2006
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • SerienTrailerMP

    SerienTraile

    7 HAZİRAN 2012