gpt4 book ai didi

rust - 如何将静态变量声明为对硬编码内存地址的引用?

转载 作者:行者123 更新时间:2023-11-29 07:51:03 25 4
gpt4 key购买 nike

我正在为 NXP 的 LPC82X 系列 Controller 编写嵌入式 Rust 代码 - 确切的工具链对于这个问题并不重要。

这些 Controller 在 ROM 中包含外围驱动程序。我想使用这些驱动程序,这意味着我需要在不链接实际代码的情况下使用不安全的 Rust 和 FFI。

ROM API 在特定地址位置公开打包到 C 结构中的函数指针。如果有人想要此 API 的详细信息,请参阅 the LPC82X manual 的第 29 章描述了有问题的 API。

我的 Rust playground 虚拟草图看起来像这样,它可以通过尚未编写的 I2C 抽象库从应用程序代码中隐藏起来。这编译。

#![feature(naked_functions)]

const I2C_ROM_API_ADDRESS: usize = 0x1fff_200c;
static mut ROM_I2C_API: Option<&RomI2cApi> = None;

#[repr(C)]
struct RomI2cApi {
// Dummy functions, real ones take arguments, and have different return
// These won't be called directly, only through the struct's implemented methods
// value
master_transmit_poll: extern "C" fn() -> bool,
master_receive_poll: extern "C" fn() -> bool,
}

impl RomI2cApi {
fn api_table() -> &'static RomI2cApi {
unsafe {
match ROM_I2C_API {
None => RomI2cApi::new(),
Some(table) => table,
}
}
}

unsafe fn new() -> &'static RomI2cApi {
ROM_I2C_API = Some(&*(I2C_ROM_API_ADDRESS as *const RomI2cApi));
ROM_I2C_API.unwrap()
}

#[inline]
fn master_transmit_poll(&self) -> bool {
(self.master_transmit_poll)()
}

#[inline]
fn master_receive_poll(&self) -> bool {
(self.master_receive_poll)()
}
}

impl From<usize> for &'static RomI2cApi {
fn from(address: usize) -> &'static RomI2cApi {
unsafe { &*(address as *const RomI2cApi) }
}
}

fn main() {
let rom_api = unsafe { RomI2cApi::api_table() };
println!("ROM I2C API address is: {:p}", rom_api);
// Should be commented out when trying !
rom_api.master_transmit_poll();
}

我不能将函数指针结构声明为非可变静态,因为静态有很多限制,包括不能在赋值中取消引用指针。有没有比 Option 更好的解决方法?将 Optionapi_table 函数一起使用至少可以保证初始化发生。

最佳答案

你完全可以避开静电:

const ROM_I2C_API: &RomI2cApi = &*(0x1fff_200c as *const RomI2cApi);

还没有工作,但计划在未来工作。现在使用

const ROM_I2C_API: *const RomI2cApi = 0x1fff_200c as *const RomI2cApi;

fn api_table() -> &'static RomI2cApi {
unsafe { &*(ROM_I2C_API) }
}

这将创建一个&'static RomI2cApi,并允许您通过调用api_table().master_transmit_poll()直接访问所有地方的功能

关于rust - 如何将静态变量声明为对硬编码内存地址的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48701896/

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