1.6 安全MMIO

安全MMIO — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/bare-metal/aps/safemmio/registers.html

1.6 安全MMIO

这 safe-mmio crate 提供了包装寄存器的类型,这些寄存器可以读取或 安全地写。

无法阅读阅读无副作用阅读有副作用
写不出来ReadPureReadOnly
可以写WriteOnlyReadPureWriteReadWrite
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 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 中弹出一个字节。
  • 阅读rsr(和其他寄存器)没有副作用。这是一本“纯粹”的读物。
  • 有许多不同的 crate 围绕 MMIO 提供安全抽象 运营;我们推荐safe-mmio箱。
  • 之间的区别ReadPure or ReadOnly(同样在之间 ReadPureWrite和ReadWrite) 是读寄存器是否可以有 改变设备状态的副作用,例如读取数据 寄存器从接收 FIFO 中弹出一个字节。ReadPure意味着读取有 没有副作用,它们纯粹是读取数据。

1.6.1 司机

01-司机 — Comprehensive Rust

1.6.2 使用它

02-使用它 — Comprehensive Rust

最后修改 August 11, 2026: 更新 (70a5af133)