2016-04-07 12 views
6

Tôi có định nghĩa đăng ký được cung cấp bởi nhà sản xuất bộ vi điều khiển có thể được xử lý dưới dạng trường bit. Sổ đăng ký được quy định như sau: định nghĩa lĩnh vựcTruyền biến uint32 vào trường bit - hành vi chưa xác định?

#define SCU_WDTSCON0 (*(SCU_WDTSCON0_type *) 0xf00360f0u) 

Bit trông như thế này:

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; 

Thay vì trực tiếp bằng văn bản cho đăng ký, tôi muốn sử dụng một biến uint32 đệm đầu tiên, nhưng vẫn có có thể chỉnh sửa nó theo cách thức của định nghĩa trường bit đăng ký. thực hiện Điều này dường như được làm việc, như địa chỉ chỉ được thay thế bằng & buffer_variable:

volatile uint32 buffer_variable; 
SCU_WDTSCON0_type register_buffer = (*(SCU_WDTSCON0_type *) &buffer_variable); 

có thể dẫn này để xác định hành vi?

+0

Đây là một câu hỏi hay. Trong tâm trí của tôi, cách kiểm tra nó là thử cùng một mã trên hai kiến ​​trúc, một người lớn cuối cùng, một chút về cuối. Tôi tình cờ có những hệ thống như vậy ở đây và nếu không có câu trả lời dứt khoát, tôi sẽ biên dịch một số mã khi tôi có thời gian. –

+1

@DavidHoelzer Điều này không liên quan gì đến endianess. Bạn không thể biết làm thế nào một bit trường lưu trữ bit của nó bất kể endianess. Hành vi của các trường bit không được xác định rõ ràng để bắt đầu. [Xem điều này] (http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223). – Lundin

+0

Thành thật mà nói, tôi hiếm khi sử dụng chúng. Tôi chỉ có thể tưởng tượng rằng sự kết thúc có thể có tác động nếu bạn đưa chúng đến một thứ khác. –

Trả lời

3

Biến bộ đệm của bạn cần phải chính xác cùng loại với một trong các thành viên công đoàn, trong trường hợp này là unsigned. Trong trường hợp trình biên dịch xử lý uint32unsigned là các loại khác nhau, nó sẽ dẫn đến hành vi không xác định (vi phạm quy tắc bí danh nghiêm ngặt). Nếu không, nếu chúng cùng loại, mã sẽ tốt.

(Lưu ý là hầu hết các lỗi liên quan đến vi phạm bí danh nghiêm ngặt đều do trình tối ưu hóa của trình biên dịch gây ra. Trong trường hợp các biến dễ bay hơi, đây là vấn đề ít hơn, vì trình biên dịch không được phép tối ưu hóa chúng. trong thực tế, tôi nghi ngờ bạn sẽ gặp phải bất kỳ UB cho kịch bản này, mặc dù nó có thể là UB trong lý thuyết.)

Các vấn đề liên quan