我正在围绕需要使用文件系统的嵌入式系统进行一个项目。我想在rust中使用liitlefs板条箱,但它使用了自1.39.0以来不推荐使用的mem::uninitialized。https://github.com/brandonedens/rust-littlefs
pub struct LittleFs<T: Storage> {
storage: T,
lfs_config: lfs::lfs_config,
lfs: lfs::lfs_t,
read_buffer: [u8; READ_SIZE],
prog_buffer: [u8; PROG_SIZE],
lookahead_buffer: [u8; LOOKAHEAD / 8],
}
impl<T: Storage> LittleFs<T> {
/// Create a new instance of the LittleFS.
pub fn new(storage: T) -> Self {
LittleFs {
storage: storage,
lfs: unsafe { mem::uninitialized::<lfs::lfs>() },
lfs_config: unsafe { mem::uninitialized::<lfs::lfs_config>() },
read_buffer: [0u8; READ_SIZE],
prog_buffer: [0u8; PROG_SIZE],
lookahead_buffer: [0u8; LOOKAHEAD / 8],
}
}
我试图用以下方式替换它,但它引起了系统的未指明行为:
pub struct LittleFs<T: Storage> {
storage: T,
lfs_config: lfs::lfs_config,
lfs: lfs::lfs_t,
read_buffer: [u8; READ_SIZE],
prog_buffer: [u8; PROG_SIZE],
lookahead_buffer: [u8; LOOKAHEAD / 8],
}
impl<T: Storage> LittleFs<T> {
pub fn new(storage: T) -> Self {
LittleFs {
storage,
lfs: unsafe { MaybeUninit::uninit().assume_init() },
lfs_config: unsafe { MaybeUninit::uninit().assume_init() },
read_buffer: [0u8; READ_SIZE],
prog_buffer: [0u8; PROG_SIZE],
lookahead_buffer: [0u8; LOOKAHEAD / 8],
}
}
有人能解决这个问题吗?提前谢谢。
您不能执行uninit().assume_init()
——它肯定不是初始化的。CCD_ 2仅在数据已经用实值初始化之后才被调用。这背后的想法是,你有希望,";是的,我知道这个值被标记为可能已初始化。我保证它现在已经初始化。这不仅仅是一个也许">
您需要更改lfs
和lfs_config
:的类型
lfs_config: MaybeUninit<lfs::lfs_config>,
lfs: MaybeUninit<lfs::lfs_t>,
这将在下游产生连锁反应,要求您修改访问字段的任何代码。
- 使用
write
初始化它们 - 用
assume_init_ref
或assume_init_mut
阅读