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). - Чтение
rsr(и других регистров) не имеет побочных эффектов. Это «чистое» (pure) чтение.
- Существует несколько разных крейтов, которые предоставляют безопасные абстракции над операциями MMIO; мы рекомендуем крейт
safe-mmio. - Разница между
ReadPureилиReadOnly(и аналогично междуReadPureWriteиReadWrite) в том, может ли чтение регистра иметь побочные эффекты, которые меняют состояние устройства, например чтение регистра данных извлекает байт из очереди приёма.ReadPureозначает, что чтение не имеет побочных эффектов, это чистое чтение данных.