[英]Cast a uint32 variable to a bit field - undefined behavior?
我有一個由微控制器制造商提供的寄存器定義,可以作為位字段處理。 寄存器定義如下:
#define SCU_WDTSCON0 (*( SCU_WDTSCON0_type *) 0xf00360f0u)
位字段定義如下所示:
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;
我想先使用uint32緩沖區變量,而不是直接寫入寄存器,但仍然能夠以寄存器位字段定義的方式對其進行編輯。 這個實現似乎有效,因為地址只是替換為&buffer_variable:
volatile uint32 buffer_variable;
SCU_WDTSCON0_type register_buffer = (*( SCU_WDTSCON0_type *) &buffer_variable);
這會導致未定義的行為嗎?
您的緩沖區變量需要與其中一個聯合成員完全相同,在本例中為unsigned
。 如果編譯器將uint32
和unsigned
視為不同類型,則會導致未定義的行為(違反嚴格的別名規則)。 否則,如果它們是相同的類型,代碼就可以了。
(作為旁注,大多數與嚴格別名違規相關的錯誤都是由編譯器的優化器引起的。對於volatile變量,這不是問題,因為編譯器無論如何都不允許優化它們。所以在實踐中,我懷疑你在這種情況下會遇到任何UB,即使理論上它可能是UB。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.