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。