Missing `pub` in register bitfields

Aperta
#478 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
rust
Ambito
embedded-iot

Direzione di ricerca

Inizia individuando le dichiarazioni dei bitfield SAU Sfsr e Sfar a cui fa riferimento l’issue, quindi esamina gli altri bitfield dei registri in SCB, SAU e nelle periferiche correlate per verificare lo stesso schema di visibilità. Verifica che i caller esterni al crate possano accedere ai metodi dei bit di stato nominati e conferma che le definizioni dei registri rimangano utilizzabili tramite la read API esistente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement

In general, the definitions for a lot of the registers defined in SCB, SAU, etc., are rather deficient, but my current complaint is the Fault Status registers.

The ones defined in SCB are just defined as RW<u32>, so if you want to check individual bits, you have to define your own bitfield (or do the bit twiddling manually). Disappointing, but usable.

In SAU, the situation seems a little better: there are bitfield macros for Sfsr and Sfar! That sounds great, until you try to use them:

#[exception]
unsafe fn SecureFault() {
    let peripherals = cortex_m::Peripherals::steal();
    let sfsr = peripherals.SAU.sfsr.read();
    if sfsr.invep() {
        log::error!("INVEP");
    }
}

which gets you

error[E0624]: method `invep` is private
   --> <snip>/src/main.rs:122:13
    |
122 |       if sfsr.invep() {
    |               ^^^^^ private method
    |
   ::: <snip>/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.7.7/src/peripheral/sau.rs:81:1
    |
81  | / bitfield! {
82  | |     /// Secure Fault Status Register description
83  | |     #[repr(C)]
84  | |     #[derive(Copy, Clone)]
...   |
93  | |     lserr, _: 7;
94  | | }
    | |_- private method defined here

so you end up having to do the same thing (define your own bitfield or do the bit twiddling manually), only now you have to pull the value out of the existing bitfield with sfsr.0.

The sau crate doesn't do anything with this register, yet this bitfield definition makes it useless outside of the crate.

Fix

The register definitions could use a lot of love 🙁, but the obvious fix here is to make the fields in the bitfield pub, e.g.:

bitfield! {
    /// Secure Fault Status Register description
    #[repr(C)]
    #[derive(Copy, Clone)]
    pub struct Sfsr(u32);
    pub invep, _: 0;
    pub invis, _: 1;
    pub inver, _: 2;
    pub auviol, _: 3;
    pub invtran, _: 4;
    pub lsperr, _: 5;
    pub sfarvalid, _: 6;
    pub lserr, _: 7;
}

// Ditto for all other `bitfield`s
Lingua principale
Rust
Stelle
1k
Fork
202
Merge medio
1g 4h
PR unite (30g)
2

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di rust-embedded/cortex-m

Tutte le issue di rust-embedded/cortex-m

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.