问题标签 [rust-no-std]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
io - 我如何最惯用地在 Rust 中为 no_std 平台编写异步 IO 库?
我正在构建一个在no_std
平台上使用的库,它允许您执行一些常见的与网络相关的 IO,例如发出 HTTP 请求或读取/写入 Websockets。
现在,我希望这个库成为一个表现良好的公民,以便它可以轻松地包含在其他no_std
应用程序中。因此,我想通过实现合理的特征等来打包库。该库将允许我不必使用alloc
,因此支持非alloc
no_std
将是理想的。
这些是我看过的选项:
embedded_hal
andnb
:这些板条箱的级别非常低(没有像Read
andWrite
或任何更高级别的通用特征)并且异步模型似乎与async/await
genio
//core_io
...:这些根本不支持异步IO。embrio
: 看起来很有趣,但似乎使用它会将我绑定到一个特定的环境,从而使库的可移植性降低。tokio
v0.2.x:我很想使用它,但根本没有no_std
支持。futures::io
v0.3.x:同样,很想使用它,但没有no_std
支持。
我应该在 no_std 环境中使用哪种异步 IO 抽象?如果现在没有好的选择,我应该在未来下注/帮助哪一个?
rust - 使用 no_std 的货物测试失败,错误代码为 176、160
在 main.rs 中使用以下代码,当我运行cargo test
它时,当我在 main 函数中添加测试或任何语句时,它会返回错误代码 176。它开始返回错误代码 160。
从这个链接我发现,
退出代码 176 的意思是“无法在网络驱动器上安装。在您的首选项中选择另一个安装位置,然后重试安装。”
当我试图通过 lldb 找到回溯时,它返回了
错误:无效线程
我找不到任何提到类似错误的线程,所以在这里问。任何帮助表示赞赏。
使用 nightly (nightly-x86_64-apple-darwin) 谢谢。
rust - 货物功能是否可以删除依赖项?
我希望增加在没有标准库的情况下使用我的 crate 的可能性。一些核心功能确实依赖于浮点函数,在 no-std 模式下需要由 libm 提供。
我见过的无标准设置的常用方法是拥有一个名为“std”的功能来启用标准库,但在这种情况下,我希望该功能删除 libm 依赖项。我可以将“附加”功能称为“无标准”,但这会导致我有某些功能在无标准模式下难以实现的问题,所以我希望它们依赖于启用的标准.
cargo 是否可以指定仅在未启用功能时才存在的可选依赖项?
rust - /usr/bin/link: 编译位标志时在 '\377\376"' 之后缺少操作数
在 Phillip Opperman 的博客操作系统之后,我一直在尝试使用 bitflags 和 x86_64 rust crates。最新的 x86_64 crate 版本将 bitflags 1.0.4 作为一个有意义的依赖项。但是,我完全无法使用多个编译器在任何目标上编译 bitflags 1.2.1(自 2019 年 6 月以来的每个版本每晚尝试一次,稳定)
每次我尝试时,Cargo 都会抛出这个错误:
(底部有更多输出)
对我来说,这是胡言乱语。显然,链接器失败了,但据我了解,bitflags crate 有一个自定义构建脚本(build.rs),它实际上只检查编译器兼容性。由于板条箱仅适用于 rustc 1.2+(某种东西),因此检查它是有道理的。然而,这也让我没有线索。这个问题的根源是什么?我看不到链接器被直接修改的任何地方会导致这样的混乱。
cargo build --verbose
输出(与之前的本节相同):
单独运行这个过程输出几乎完全相同的东西,没有新信息。
编辑:我在 bash for windows 上尝试这个,我的 MSVC 链接器和套件的其余部分都坏了(windows 不喜欢我)。我相信这个大量的打印输出是因为终端默认使用 gnu 链接器,它不喜欢这样。重新安装构建工具并更新我的工具链和 xbuild 后,一切正常。感谢那些试图提供帮助的人!
rust - Rust #![no_std]:未解析的外部符号 _mainCRTStartup
我想开始一个 Rust no_std 项目,所以我简单地创建了一个新的 cargo 包并在 main.rs 中写了以下几行:
Cargo.toml 文件如下所示:
我跑cargo build
了,链接器打印了:
该错误背后的原因可能是什么?
rust - 当我知道没有更多对其当前内容的引用时,如何对切片进行变异?
在没有堆的嵌入式设备上,我想解析输入数据并将找到的结果存储在输出切片中。我有一个阅读器,它允许我获取当前可用的数据和一个解析器,它将输入数据与预期的格式相匹配,并将结果存储在Parsed::Value
s 的切片中,该切片可能包含对输入数据的引用。
由于 Rust 编译器发现可能存在对输入数据的引用,因此我不能多次更改数据缓冲区。由于我可以通过手动将输出切片重置为 来确保不再有引用Parsed::Unused
,我认为重用缓冲区应该是安全的。如何在循环的每次迭代中改变输入缓冲区?
以下是我的最小示例,它说明了我的问题:
string - 添加 str no_std 锈
我已经开始编写 no_std Rust 代码,现在我正在尝试添加字符串。
这是我的代码:
在 no_std 程序中是否有任何好的库可以做这样的事情?
string - 运行时构建:在此范围内找不到字符串
基板开发人员可能会遇到一个常见问题:开发自定义托盘以将映射存储到具有常见类型的存储中,例如String
. 举个例子:
在构建运行时,您会收到以下错误String
:
为什么Strings
不包括在范围内?和其他std
锈类型?
rust - 在 no_std 环境中,我应该用什么替换 Vec 和 HashSet?
我正在开发一个旨在编译为 webassembly 的项目。所以我想我必须将库标记为 no_std。但由于它目前非常依赖 Vec、String 和 HashSet,这似乎是不可能的,因为我收到了这些功能的错误。
如何在不丢失 no_std 环境(如 webassembly)中的功能的情况下删除/替换这些功能。我想我可以选择 &str 而不是 String,但是其他的呢?
如果我删除#![cfg_attr(not(test), no_std)]
并编译该项目,它似乎可以作为 webassembly 二进制文件工作。如果在添加行时出现错误,为什么会这样?
rust - 如何有效地从计算的部分构建一个字节数组?
我需要构建一个表示设备命令的字节数组。它可能看起来像这样:
有些命令带参数,有些不带。有些参数需要计算。每个命令的大小都是固定的,因此在编译时就知道数组需要多大。
像这样构造它会很好,我将字节组抽象为命令:
我还没有找到任何方法来使用函数或宏来做到这一点。我在no_std
,所以我不使用集合。
如何在 Rust 中实现类似的东西?