複数のレジスタ

構造体を使って、UART のレジスタのメモリレイアウトを表現できます。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[repr(C, align(4))]
pub 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 のデフォルト表現では、コンパイラは(とりわけ) フィールドを自由に並べ替えることができるためです。