Bir yapının belirli bir üyesini nasıl geçici olarak bildiriyorsunuz?C'de, bir yapının üyelerini nasıl uçucu olarak ilan edersiniz?
cevap
olmayan struct
alanlar birbirinin aynı:
#include <stdio.h>
int main (int c, char *v[]) {
struct _a {
int a1;
volatile int a2;
int a3;
} a;
a.a1 = 1;
a.a2 = 2;
a.a3 = 3;
return 0;
}
Sen "volatile struct _a {...}"
kullanarak tüm struct
gibi uçucu işaretleyebilirsiniz ancak yukarıdaki yöntem bireysel alanlar içindir.
this makaleye göre oldukça yalındır olmalıdır:
Son olarak, bir yapı veya birliğe uçucu uygularsanız, tüm içeriği struct/birliğin uçucu bulunmaktadır. Bu davranışı istemiyorsanız, struct/union öğesinin bağımsız üyelerine bireysel üyelerini uygulayabilirsiniz.
Sadece C/C++ uçucu anahtar sözcüğündeki bir uyarı.
Ne yaptığınızı bilmiyorsanız, onu asla kullanmamalısınız.
C/C++ uçucu! = Java/Gerçekten sen, C++ 0x atomik şablonunu (ya da bir şey benzer) kullanmak gerekir ne yaptığını bilmiyorsanız dişli kodunda yardımcı olmuyor uçucuuçucu C#.
Uçurumu kullanmak için kullanmam gereken tek zamandır, donanım kayıtlarını kontrol etmek.
Bazı kesilmelere (örneğin, bir sinyal işleyici veya başka (yakın) atomik değişken) hizmet verdiğinden, uçucu olarak bildirilen üyeler değişmezse, büyük olasılıkla uçucu olmamalıdır (çoğu derleyici, yeterince yakın). Diğerleri söylediler gibi derleyici aslında sizin :) Bazı durumlarda
, yani aynı fikirdeyse
Aksi halde .. sadece görmek için daha sonra asm incelemek dökümlerini kullanmak gcc belirli sürümleri .. o kontrol onun değerinde döker.
Sanırım kesinlikle gerekli olandan biraz daha güçlü olduğunu belirttiniz. Uçucu, özellikle tek çekirdekli gömülü platformlarda, dişli kodla yardımcı olur. Ama onu nasıl kullanacağını bilmek zorundasın. Ayrıca, DMA ile veya DMA olmaksızın donanım kayıtlarına başvururken, özellikle de statü için sorgulanacak bir kayıt olduğunda etkili bir şekilde zorunludur. Önbelleğinizi ve doğru bir şekilde nasıl yöneteceğinizi ve platformunuzda atomik işlemleri nasıl yapacağınızı anlamak da gereklidir. – RBerteig
Haklısınız. DMA dediğimde düşündüğümü bilmiyordum, MMIO demek istedim. Cevabı daha iyi bir şeye düzenledim (umarım). –
wikipedia (http://en.wikipedia.org/wiki/Volatile_variable) 'a göre C#, C/C++ ile aynı davranışı gösterirken, sadece Java'nın farklı bir semantiği vardır. –