複数のレジスタ
構造体を使って、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 のデフォルト表現では、コンパイラは(とりわけ) フィールドを自由に並べ替えることができるためです。