简体   繁体   English

嵌入式 Rust Discovery Book 示例无法编译

[英]Embedded Rust Discovery Book example fails to compile

I am new to rust and embedded systems.我是 rust 和嵌入式系统的新手。 I was reading and going along " The Discovery Book " and I can't seem to figure out the errors below.我正在阅读并阅读“发现书”,但我似乎无法弄清楚下面的错误。

I have placed this in my main.rs :我把它放在我的main.rs中:

#![deny(unsafe_code)]
#![no_main]
#![no_std]

use aux5::{entry, prelude::*, Delay, Leds};

#[entry]
fn main() -> ! {
    let (mut delay, mut leds): (Delay, Leds) = aux5::init();

    let half_period = 500_u16;

    loop {
        leds[0].on();
        delay.delay_ms(half_period);

        leds[0].off();
        delay.delay_ms(half_period);
    }
}

My auxiliary lib.rs contains:我的辅助lib.rs包含:

pub use stm32f3_discovery::{leds::Leds, stm32f3xx_hal, switch_hal};
pub use switch_hal::{ActiveHigh, OutputSwitch, Switch, ToggleableOutputSwitch};

use stm32f3xx_hal::prelude::*;
pub use stm32f3xx_hal::{
    delay::Delay,
    gpio::{gpioe, Output, PushPull},
    hal::blocking::delay::DelayMs,
    stm32,
};

pub type LedArray = [Switch<gpioe::PEx<Output<PushPull>>, ActiveHigh>; 8];

pub fn init() -> (Delay, LedArray) {
    let device_periphs = stm32::Peripherals::take().unwrap();
    let mut reset_and_clock_control = device_periphs.RCC.constrain();

    let core_periphs = cortex_m::Peripherals::take().unwrap();
    let mut flash = device_periphs.FLASH.constrain();
    let clocks = reset_and_clock_control.cfgr.freeze(&mut flash.acr);
    let delay = Delay::new(core_periphs.SYST, clocks);

    // initialize user leds
    let mut gpioe = device_periphs.GPIOE.split(&mut reset_and_clock_control.ahb);
    let leds = Leds::new(
        gpioe.pe8,
        gpioe.pe9,
        gpioe.pe10,
        gpioe.pe11,
        gpioe.pe12,
        gpioe.pe13,
        gpioe.pe14,
        gpioe.pe15,
        &mut gpioe.moder,
        &mut gpioe.otyper,
    );

    (delay, leds.into_array())
}

I have not changed anything in lib.rs and I am following the instructions from the book, along with the source code .我没有更改lib.rs中的任何内容,我正在按照书中的说明以及源代码进行操作。

Running the code results in the following errors when building for the target:为目标构建时,运行代码会导致以下错误:

error[E0432]: unresolved import `aux5::prelude`
 --> src\05-led-roulette\src\main.rs:5:19
  |
5 | use aux5::{entry, prelude::*, Delay, Leds};
  |                   ^^^^^^^ could not find `prelude` in `aux5`

error[E0308]: mismatched types
 --> src\05-led-roulette\src\main.rs:9:48
  |
9 |     let (mut delay, mut leds): (Delay, Leds) = aux5::init();
  |                                -------------   ^^^^^^^^^^^^ expected struct `Leds`, found array of 8 elements
  |                                |
  |                                expected due to this
  |
  = note: expected tuple `(Delay, Leds)`
             found tuple `(Delay, [Switch<PEx<Output<PushPull>>, ActiveHigh>; 8])`

error[E0608]: cannot index into a value of type `Leds`
  --> src\05-led-roulette\src\main.rs:14:9
   |
14 |         leds[0].on();
   |         ^^^^^^^

error[E0599]: no method named `delay_ms` found for struct `Delay` in the current scope
  --> src\05-led-roulette\src\main.rs:15:15
   |
15 |         delay.delay_ms(half_period);
   |               ^^^^^^^^ method not found in `Delay`
   |
   = help: items from traits can only be used if the trait is in scope
help: the following trait is implemented but not in scope; perhaps add a `use` for it:
   |
5  | use aux5::DelayMs;
   |

error[E0608]: cannot index into a value of type `Leds`
  --> src\05-led-roulette\src\main.rs:17:9
   |
17 |         leds[0].off();
   |         ^^^^^^^

error[E0599]: no method named `delay_ms` found for struct `Delay` in the current scope
  --> src\05-led-roulette\src\main.rs:18:15
   |
18 |         delay.delay_ms(half_period);
   |               ^^^^^^^^ method not found in `Delay`
   |
   = help: items from traits can only be used if the trait is in scope
help: the following trait is implemented but not in scope; perhaps add a `use` for it:
   |
5  | use aux5::DelayMs;
   |

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0308, E0432, E0599, E0608.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `led-roulette`

To learn more, run the command again with --verbose.

From the following page, "The Led and Delay abstractions" , it looks like this is the set of imports that you need.从下一页“The Led and Delay abstractions” ,看起来这是您需要的一组导入。

use aux5::{entry, Delay, DelayMs, LedArray, OutputSwitch};

In the above abstraction, compared to your main.rs , note the:在上述抽象中,与您的main.rs相比,请注意:

  • Addition of DelayMs trait, making .delay_ms() available.添加DelayMs特征,使.delay_ms()可用。
  • Removal of a prelude as it is not being used.删除prelude ,因为它没有被使用。
  • Change from Leds to the expected LedArray .Leds更改为预期的LedArray

Also see:另见:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM