基板开发人员可能会遇到的一个常见问题是:开发自定义托盘以将映射存储到具有常见类型的存储中,例如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锈类型?我希望增加在没有标准库的情况下使用我的板条箱的可能性。一些核心功能确实依赖于浮点函数,这些函数在 no-std 模式下需要由 libm 提供。
我见过的无标准设置的通常方法是使用一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能能够删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致一个问题,即我有某些功能很难在无标准模式下实现,所以我希望它们依赖于启用标准。
货物是否可以指定仅在未启用功能时才存在的可选依赖项?
我正在开发一个旨在编译为 WebAssembly 的项目。所以我想我必须将库标记为 no_std。但由于它目前很大程度上依赖于 Vec、String 和 HashSet,这似乎是不可能的,因为我在这些功能上遇到了错误。
如何删除/替换这些功能而不丢失像 webassemble 这样的 no_std 环境中的功能。我想我可以选择 &str 而不是 String,但是其他的呢?
如果我删除#![cfg_attr(not(test), no_std)]并编译该项目,它似乎可以作为 WebAssembly 二进制文件工作。如果我在添加行时出现错误,这是为什么?
我正在构建一个在平台上使用的库,no_std该库允许您执行一些常见的与网络相关的 IO,例如发出 HTTP 请求或读取/写入 Websockets。
现在,我希望这个库成为一个行为良好的公民,以便它可以轻松地包含在其他no_std应用程序中。因此,我想通过实现合理的特征等来打包该库。该库将允许我不必使用alloc,因此支持 non-alloc no_std将是理想的选择。
这些是我看过的选项:
embedded_haland nb:这些板条箱的级别确实很低(没有像Read和Write或任何更高级别的通用特征)并且异步模型似乎与async/awaitgenio// core_io...:这些根本不支持异步IO。embrio:看起来很有趣,但似乎使用它会将我束缚在一个特定的环境中,从而使该库的可移植性较差。tokiov0.2.x:我很想使用它,但no_std根本不支持。futures::iov0.3.x:同样,很想使用它,但没有no_std支持。我应该在 no_std 环境中使用哪种异步 IO 抽象?如果现在没有好的选择,我应该为未来下注/提供帮助?
我正在寻找构建一个将被复制到 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) 如何使用取自某个范围的值生成一个长常量数组?奖励: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)
至少有一个问题似乎是宏在范围表达式扩展为文字列表之前被评估。
在示例中,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 ×8
rust-no-std ×8
arrays ×2
c ×1
compile-time ×1
constants ×1
embedded ×1
ffi ×1
io ×1
rust-cargo ×1
string ×1
substrate ×1
type-punning ×1
webassembly ×1