标签: rust-no-std

运行时构建:在此范围内找不到字符串

基板开发人员可能会遇到的一个常见问题是:开发自定义托盘以将映射存储到具有常见类型的存储中,例如String. 举个例子:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}
Run Code Online (Sandbox Code Playgroud)

在构建运行时,您会收到每个错误String

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope
Run Code Online (Sandbox Code Playgroud)

为什么Strings不包括在范围内?和其他std锈类型?

string rust substrate rust-no-std

6
推荐指数
1
解决办法
665
查看次数

货物功能是否可以删除依赖项?

我希望增加在没有标准库的情况下使用我的板条箱的可能性。一些核心功能确实依赖于浮点函数,这些函数在 no-std 模式下需要由 libm 提供。

我见过的无标准设置的通常方法是使用一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能能够删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致一个问题,即我有某些功能很难在无标准模式下实现,所以我希望它们依赖于启用标准。

货物是否可以指定仅在未启用功能时才存在的可选依赖项?

dependency-management rust rust-cargo rust-no-std

6
推荐指数
1
解决办法
2296
查看次数

在 no_std 环境中我该如何替换 Vec 和 HashSet?

我正在开发一个旨在编译为 WebAssembly 的项目。所以我想我必须将库标记为 no_std。但由于它目前很大程度上依赖于 Vec、String 和 HashSet,这似乎是不可能的,因为我在这些功能上遇到了错误。

如何删除/替换这些功能而不丢失像 webassemble 这样的 no_std 环境中的功能。我想我可以选择 &str 而不是 String,但是其他的呢?

如果我删除#![cfg_attr(not(test), no_std)]并编译该项目,它似乎可以作为 WebAssembly 二进制文件工作。如果我在添加行时出现错误,这是为什么?

rust webassembly rust-no-std

6
推荐指数
2
解决办法
4059
查看次数

如何最惯用地在 Rust 中为 no_std 平台编写异步 IO 库?

我正在构建一个在平台上使用的库,no_std该库允许您执行一些常见的与网络相关的 IO,例如发出 HTTP 请求或读取/写入 Websockets。

现在,我希望这个库成为一个行为良好的公民,以便它可以轻松地包含在其他no_std应用程序中。因此,我想通过实现合理的特征等来打包该库。该库将允许我不必使用alloc,因此支持 non-alloc no_std将是理想的选择。

这些是我看过的选项:

  • embedded_haland nb:这些板条箱的级别确实很低(没有像ReadWrite或任何更高级别的通用特征)并且异步模型似乎与async/await
  • genio// core_io...:这些根本不支持异步IO。
  • embrio:看起来很有趣,但似乎使用它会将我束缚在一个特定的环境中,从而使该库的可移植性较差。
  • tokiov0.2.x:我很想使用它,但no_std根本不支持。
  • futures::iov0.3.x:同样,很想使用它,但没有no_std支持。

我应该在 no_std 环境中使用哪种异步 IO 抽象?如果现在没有好的选择,我应该为未来下注/提供帮助?

embedded io rust rust-no-std

5
推荐指数
1
解决办法
489
查看次数

如何用重复的 u16 值填充 [u8] 数组?

我正在寻找构建一个将被复制到 RAM 并发送到 LCD 驱动程序的数组。我希望能够传入一个颜色值 ( color: u16) 并使用它来填充数组。请注意,我正在使用#![no_std]因为这是用于嵌入式应用程序的。

显而易见的简单方法如下:

let mut block: [u8;256] = [0; 256];
for i in (0..block.len()).step_by(2) {
    block[i] = ((color && 0xFF00) >> 8) as u8;
    block[i+1] = (color && 0xFF) as u8;
}
Run Code Online (Sandbox Code Playgroud)

由于我更多的个人经验来自 C,我想知道是否有使用类型转换和转换的更好的解决方案。例如,使用 Rust 初始化 u16 数组并转换为 u8 数组:

let block_u16: [u16; 128] = [color; 128]
let block_u8 = block_u16 as [u8; 256];
Run Code Online (Sandbox Code Playgroud)

作为参考,目标函数原型为:

spi::setup_block(block: &[u8]);
Run Code Online (Sandbox Code Playgroud)

type-conversion type-punning rust rust-no-std

4
推荐指数
1
解决办法
242
查看次数

使用 #[!no_std] 通过 FFI 将数组从 C 传递到 Rust

这个关于将数组从 C 传递到 Rust 的问题的所有答案都std::slice::from_raw_parts用于将原始 C 指针和一些长度信息转换为 Rust。在嵌入式环境中(在我的例子中是MOS 6502),可能没有可用的std库。那么#![no_std]上下文中,将数组从 C 传递到 Rust 以进行(可能可变的)处理的最佳方式是什么?

c arrays ffi rust rust-no-std

4
推荐指数
1
解决办法
48
查看次数

来自范围的常量数组

如何使用取自某个范围的值生成一个长常量数组?奖励:1)使用 no_std,2)不使用任何板条箱

我想做什么:

struct A {
    a: i32,
    b: B
}

enum B {
    One,
    Two
}

const AS: [A; 1024] = [A{a: 1, b: B::One}, A{a: 2, b: B::One}, ..., A{a: 1024, b: B::One}]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我得到的最远的是:

macro_rules! generate_list {
    ($($a:expr)+, $variant:expr) =>  {
        [ $( A { a: $a, b: $variant } )* ]
    }
}
const AS: [A; 1024] = generate_list!(1..1025i32, B::One);
Run Code Online (Sandbox Code Playgroud)

至少有一个问题似乎是宏在范围表达式扩展为文字列表之前被评估。

arrays constants compile-time rust rust-no-std

3
推荐指数
1
解决办法
133
查看次数

为什么 no_std 板条箱可以依赖于使用 std 的板条箱?

在示例中,hs 从 std 重新导出 HashSet。但它编译时没有错误或警告。为什么?

#![no_std]

pub use hs::HashSet;

pub fn new() -> HashSet<usize> {
    HashSet::new()
}

pub fn insert(a: &mut HashSet<usize>, v: usize) {
    a.insert(v);
}
Run Code Online (Sandbox Code Playgroud)

rust rust-no-std

2
推荐指数
1
解决办法
648
查看次数