多个寄存器

我们可以使用结构体来表示 UART 寄存器的内存布局。

  1. #[repr(C, align(4))]
  2. struct Registers {
  3. dr: u16,
  4. _reserved0: [u8; 2],
  5. rsr: ReceiveStatus,
  6. _reserved1: [u8; 19],
  7. fr: Flags,
  8. _reserved2: [u8; 6],
  9. ilpr: u8,
  10. _reserved3: [u8; 3],
  11. ibrd: u16,
  12. _reserved4: [u8; 2],
  13. fbrd: u8,
  14. _reserved5: [u8; 3],
  15. lcr_h: u8,
  16. _reserved6: [u8; 3],
  17. cr: u16,
  18. _reserved7: [u8; 3],
  19. ifls: u8,
  20. _reserved8: [u8; 3],
  21. imsc: u16,
  22. _reserved9: [u8; 2],
  23. ris: u16,
  24. _reserved10: [u8; 2],
  25. mis: u16,
  26. _reserved11: [u8; 2],
  27. icr: u16,
  28. _reserved12: [u8; 2],
  29. dmacr: u8,
  30. _reserved13: [u8; 3],
  31. }
  • 通过运行 #[repr(C)] 命令,指示编译器按顺序布置结构体字段,遵循与 C 语言相同的规则。这是确保结构体具有可预测布局的必要条件,因为默认的 Rust 表示法允许编译器(以及其他内容)按照其认为合适的方式重新排列字段。