Mikrodenetleyici üreticisi tarafından sağlanan ve bit alanı olarak kullanılabilecek bir kayıt tanımım var.Bir uint32 değişkenini bir bit alanına dönüştürün - tanımsız davranış?
#define SCU_WDTSCON0 (*(SCU_WDTSCON0_type *) 0xf00360f0u)
bitlik alan tanımı aşağıdaki gibidir:: kayıt aşağıdaki şekilde tanımlanmaktadır
typedef volatile union {
unsigned U;
int I;
struct {
unsigned ENDINIT :1; // [0:0] End-of-Initialization Control Bit
unsigned LCK :1; // [1:1] Lock Bit to Control Access to WDTxCON0
unsigned HPW0 :2; // [3:2] Hardware Password 0
unsigned HPW1 :4; // [7:4] Hardware Password 1
unsigned PW :8; // [15:8] User-Definable Password Field for Access to WDTxCON0
unsigned REL :16; // [31:16] Reload Value for the WDT
} B;
} SCU_WDTSCON0_type;
yerine doğrudan kayıt yazılı
, Önce bir uint32 tampon değişkeni kullanmak istiyorum, ama yine de olabilir kayıt biti alanı tanımı biçiminde düzenleyebilir.volatile uint32 buffer_variable;
SCU_WDTSCON0_type register_buffer = (*(SCU_WDTSCON0_type *) &buffer_variable);
Olabilir bu kurşun istenmeyen davranışlara: Bu uygulama adresi sadece & buffer_variable değiştirilir olarak, çalışıyor gibi görünüyor?
Bu iyi bir soru. Zihnimde bunu test etmenin yolu, aynı kodu iki mimaride, bir büyük endianda, küçük bir endianda denemek. Burada böyle sistemlere sahip olurum ve eğer kesin bir cevap yoksa zamanım olduğunda bazı kodları derlerim. –
@DavidHoelzer Bu, endianess ile ilgisi yok. Bir bit alanının, bitintisiz olarak bitlerini nasıl sakladığını bilemezsiniz. Bit alanlarının davranışı, başlamak için iyi belirlenmemiş. [Bkz.] (Http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223). – Lundin
Dürüst olmak gerekirse, onları nadiren kullanırım. Onları başka bir şeye çevirirseniz, endianitenin bir etkisi olabileceğini hayal edebiliyorum. –