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?
Đâ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. –
@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
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. –