多个寄存器
我们可以使用结构体来表示 UART 寄存器的内存布局。
#[repr(C, align(4))]
struct Registers {
dr: u16,
_reserved0: [u8; 2],
rsr: ReceiveStatus,
_reserved1: [u8; 19],
fr: Flags,
_reserved2: [u8; 6],
ilpr: u8,
_reserved3: [u8; 3],
ibrd: u16,
_reserved4: [u8; 2],
fbrd: u8,
_reserved5: [u8; 3],
lcr_h: u8,
_reserved6: [u8; 3],
cr: u16,
_reserved7: [u8; 3],
ifls: u8,
_reserved8: [u8; 3],
imsc: u16,
_reserved9: [u8; 2],
ris: u16,
_reserved10: [u8; 2],
mis: u16,
_reserved11: [u8; 2],
icr: u16,
_reserved12: [u8; 2],
dmacr: u8,
_reserved13: [u8; 3],
}
- 通过运行 #[repr(C)] 命令,指示编译器按顺序布置结构体字段,遵循与 C 语言相同的规则。这是确保结构体具有可预测布局的必要条件,因为默认的 Rust 表示法允许编译器(以及其他内容)按照其认为合适的方式重新排列字段。