the trait bound `UnlockedFlash<‘_>: embedded_storage::nor_flash::NorFlash` is not satisfied

error[E0277]: the trait bound `UnlockedFlash<'_>: embedded_storage::nor_flash::NorFlash` is not satisfied
  --> src\main.rs:25:21
   |
25 |     NorFlash::erase(&mut unlocked_flash, 0, 0x1000).ok();
   |     --------------- ^^^^^^^^^^^^^^^^^^^ the trait `embedded_storage::nor_flash::NorFlash` is not implemented for `UnlockedFlash<'_>`
   |     |
   |     required by a bound introduced by this call

在使用stm32f4xx-hal-0.13.2尝试写个通用bootloader的时候,遇到了这个奇怪的问题。代码如下:

#![no_main]
#![no_std]

use embedded_hal::blocking::delay::DelayMs;
use cortex_m_rt::entry;
#[allow(unused_imports)]
use cortex_m_semihosting::hprintln;
use embedded_storage::nor_flash::NorFlash;
use bxcan::{Frame, StandardId, filter::Mask32};
use heapless::Vec;

use stm32f4xx_hal::{
    pac, prelude::*,
    flash::{FlashExt, LockedFlash, UnlockedFlash},
};

extern crate panic_halt;

#[entry]
fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();
    let mut flash = LockedFlash::new(dp.FLASH);
    let mut unlocked_flash: UnlockedFlash = flash.unlocked();
    NorFlash::erase(&mut unlocked_flash, 0, 0x1000).ok();
    panic!("");
}

明明UnlockedFlash实现了embedded-storage的NorFlash,这里却报错没有实现,导致无法调用。但是直接改stm32f4xx-hal-0.13.2里面的example调用NorFlash::erase(&mut unlocked_flash, 0, 0x1000).ok()又不会报错。

最后尝试修改hal库的实现,把NorFlash导出来,然后直接use导出来的这个trait,通过了。

use stm32f4xx_hal::flash::NorFlash;

发现这个基本就知道应该是hal库用的embedded-storage和我用的不一样,查了下,果然:hal库用的v0.2.0,我用的是最新的v0.3.0。

cargo会对依赖的所有crate分配一个hash id,同一个crate的不同版本会有不同的hash id,可以当作2个独立的crate看待,这样带来的好处就是可以同时依赖同一个crate的多个版本,坏处就是在所有依赖里面,一个crate下定义的type在不同版本里面有不同的TypeId,所以才出现了上面的报错:调用trait和实现trait同名但不同type。

你可能感兴趣的:(rust,嵌入式,embedded-hal,stm32,embedded-hal,rust,stm32f4xx-hal)