Rust 中的有状态嵌入式库

Stateful embedded library in Rust

提问人:Stefan 提问时间:1/14/2023 最后编辑:jebStefan 更新时间:1/14/2023 访问量:71

问:

我想在 Rust 中为微控制器开发一个库,其中包含一些状态信息。 此状态数据无法传输到库的调用方。我正在使用 .该库应适用于裸机应用程序和 RTOS,如 Zephyr OS 或 FreeRTOS。 到目前为止,我的方法是使用:#![no_std]lazy_static

use heapless::Vec;

lazy_static! {
    static ref nodes: Vec<u8, 100> = Vec::new();
}



fn foo(){
 nodes.push(1); 
}

此示例不编译。我收到以下错误:

cannot borrow data in dereference of `nodes` as mutable
trait `DerefMut` is required to modify through a dereference, but it is not implemented for `nodes`

谷歌搜索这个错误,我喜欢需要互斥锁,请参阅链接。我不知道如何在代码中实现这一点。#![no_std]

然而,更重要的是一个问题:当使用时,处理全局状态的惯用方式是什么?#![no_std]

状态 惰性静态 生锈无性病

评论

2赞 PitaJ 1/14/2023
全局可变状态通常不是惯用的。您能提供有关您的用例的更多详细信息吗?
1赞 cafce25 1/14/2023
如果你必须这样做,你仍然可以使用一个,而不是一个。旋转板条箱使用 Spinlock 提供同步基元。Mutexstd
0赞 PitaJ 1/14/2023
理想情况下,如果绝对必须具有可变全局状态,则应让用户提供互斥类型。然后,他们可以使用类似 cortex_m::interrupt::Mutex 的东西
0赞 Stefan 1/15/2023
@PitaJ:用例是一个库,它将在 TrustZone-M 设备 (Cortex-M23/33) 的安全世界中运行。该库将从非安全世界调用。可变状态是一个秘密,不应该从不安全的世界访问。您能解释一下用户如何提供互斥类型吗?
0赞 PitaJ 1/15/2023
密钥是否需要在执行过程中更改,还是只需要初始化一次?

答: 暂无答案