2016-04-07 35 views
6

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?

+0

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. –

+1

@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

+0

Dürüst olmak gerekirse, onları nadiren kullanırım. Onları başka bir şeye çevirirseniz, endianitenin bir etkisi olabileceğini hayal edebiliyorum. –

cevap

3

Arabellek değişkeninizin, bu durumda, unsigned numaralı üyeden biri ile aynı türde olması gerekir. Derleyici, uint32 ve unsigned'u farklı türlerde ele alırsa, tanımlanmamış davranışlara yol açar (katı takma kuralını ihlal eder). Aksi takdirde, aynı türse, kod iyidir.

(Bir yan not olarak, sıkı bir takma ihlaliyle ilgili hataların çoğu, derleyicinin en iyileştiricisi tarafından kaynaklanır. Derleyici değişkenler söz konusu olduğunda, derleyicinin onları her zaman optimize etmesine izin verilmediğinden, bu daha az sorun olur. Pratikte, bu senaryo için herhangi bir UB ile karşılaşacağınızdan şüpheliyim, teoride UB olabilirdi.)