簡體   English   中英

將uint32變量轉換為位字段 - 未定義的行為?

[英]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 如果編譯器將uint32unsigned視為不同類型,則會導致未定義的行為(違反嚴格的別名規則)。 否則,如果它們是相同的類型,代碼就可以了。

(作為旁注,大多數與嚴格別名違規相關的錯誤都是由編譯器的優化器引起的。對於volatile變量,這不是問題,因為編譯器無論如何都不允許優化它們。所以在實踐中,我懷疑你在這種情況下會遇到任何UB,即使理論上它可能是UB。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM