gpt4 book ai didi

rust - 为什么 svd2rust 生成的一些寄存器函数使用 unsafe 而另一些则不使用?

转载 作者:行者123 更新时间:2023-11-29 08:15:14 25 4
gpt4 key购买 nike

我正在检查 Rust 代码在嵌入式系统中的使用,以了解库中 unsafe 的使用。

具体来说,我查看了 svd2rust 生成的 stm32f30x 库。当我查看与 GPIOA 外设的 afrhmoder 寄存器关联的函数时, 的位值设置>afrh 寄存器的字段需要不安全代码,而 moder 寄存器的字段不需要。

这是从afrh_register_functions 中提取的代码和 moder_register_functions

afrh 寄存器

pub unsafe fn bits(self, value: u8) -> &'a mut W {
const MASK: u8 = 15;
const OFFSET: u8 = 28;
self.w.bits &= !((MASK as u32) << OFFSET);
self.w.bits |= ((value & MASK) as u32) << OFFSET;
self.w
}

现代寄存器

pub fn bits(self, value: u8) -> &'a mut W {
const MASK: u8 = 3;
const OFFSET: u8 = 22;
self.w.bits &= !((MASK as u32) << OFFSET);
self.w.bits |= ((value & MASK) as u32) << OFFSET;
self.w
}

最佳答案

窥视codebase对于 svd2rust,我找到了函数 unsafety这似乎是为了确定是否将 unsafe 关键字插入到生成的代码中。

它看起来好像在尝试从 SVD 文件中确定将给定大小的任何值写入给定寄存器是否安全。这是有道理的——有时寄存器有某些不应该使用的位组合,或者可能有未定义的结果。

请注意,此处的 unsafe 关键字应用于该函数。根据 rust 书:

The unsafe keyword in this context indicates the function has requirements we need to uphold when we call this function, because Rust can’t guarantee we’ve met these requirements. By calling an unsafe function within an unsafe block, we’re saying that we’ve read this function’s documentation and take responsibility for upholding the function’s contracts.

因此,rust 代码本身可能不是不安全的,但调用它可能取决于提供的参数。

我查看了 stm32f30x 的 svd 文件,我看不出 svd2rust 是如何得出这个结论的,也许其他人可以在那里启发我们。

关于rust - 为什么 svd2rust 生成的一些寄存器函数使用 unsafe 而另一些则不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57895504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com