safe-mmio
safe-mmio クレートは、レジスタを安全に読み書きできるようにラップする型を提供します。
| 読み取り不可 | 読み取りに副作用がない | 読み取りに副作用がある | |
|---|---|---|---|
| 書き込み不可 | ReadPure | ReadOnly | |
| 書き込み可 | WriteOnly | ReadPureWrite | ReadWrite |
// Copyright 2025 Google LLC // SPDX-License-Identifier: Apache-2.0 use safe_mmio::fields::{ReadPure, ReadPureWrite, ReadWrite, WriteOnly}; #[repr(C, align(4))] pub struct Registers { dr: ReadWrite<u16>, _reserved0: [u8; 2], rsr: ReadPure<ReceiveStatus>, _reserved1: [u8; 19], fr: ReadPure<Flags>, _reserved2: [u8; 6], ilpr: ReadPureWrite<u8>, _reserved3: [u8; 3], ibrd: ReadPureWrite<u16>, _reserved4: [u8; 2], fbrd: ReadPureWrite<u8>, _reserved5: [u8; 3], lcr_h: ReadPureWrite<u8>, _reserved6: [u8; 3], cr: ReadPureWrite<u16>, _reserved7: [u8; 3], ifls: ReadPureWrite<u8>, _reserved8: [u8; 3], imsc: ReadPureWrite<u16>, _reserved9: [u8; 2], ris: ReadPure<u16>, _reserved10: [u8; 2], mis: ReadPure<u16>, _reserved11: [u8; 2], icr: WriteOnly<u16>, _reserved12: [u8; 2], dmacr: ReadPureWrite<u8>, _reserved13: [u8; 3], }
drの読み取りには副作用があります。受信 FIFO から 1 バイト取り出します。rsr(および他のレジスタ)の読み取りには副作用がありません。これは「pure」な読み取りです。
- MMIO 操作に対する安全な抽象化を提供するクレートはいくつかありますが、
safe-mmioクレートを推奨します。 ReadPureとReadOnlyの違い(同様にReadPureWriteとReadWriteの違い)は、レジスタの読み取りにデバイスの状態を変化させる副作用があり得るかどうかです。たとえば、データレジスタを読み取ると受信 FIFO から 1 バイト取り出されます。ReadPureは、読み取りに副作用がなく、純粋にデータを読み取るだけであることを意味します。