使用 Rust 进行嵌入式开发

  发布时间:2025-11-04 04:13:09   作者:玩站小弟   我要评论
Rust 的高性能、高可靠性和高生产力使它适合于嵌入式系统。在过去的几年里,Rust 在程序员中获得了热情的追捧。技术潮流来来去去,所以很难将仅仅因为某项新技术而产生的兴奋与对某项技术的优点的兴奋区分 。

Rust 的使用式开高性能、高可靠性和高生产力使它适合于嵌入式系统。进行

在过去的嵌入几年里,Rust 在程序员中获得了热情的使用式开追捧。技术潮流来来去去,进行所以很难将仅仅因为某项新技术而产生的嵌入兴奋与对某项技术的优点的兴奋区分开来,但我认为 Rust 是使用式开一种真正设计良好的语言。它的进行目标是帮助开发者建立可靠和高效的软件,而且它从一开始就是嵌入为这个目的设计的。你可能听过一些 Rust 的使用式开关键特性,在这篇文章中,进行我会证明这些特性正是嵌入 Rust 也恰好适合嵌入式系统的原因。比如:

高性能:它速度快,使用式开内存利用率高 可靠性:在编译过程中可以消除内存错误 生产力:很棒的进行文档,友好的嵌入编译器,云南idc服务商有用的错误信息,以及一流的工具化。它有一个集成的包管理器和构建工具,智能的多编辑器支持自动补完和类型检查、自动格式化等等。

为什么使用 Rust 进行嵌入式开发?

Rust 的设计是为了保证安全和高性能。嵌入式软件会出现的问题主要是内存的问题。从某种程度上说,Rust 是一种面向编译器的语言,所以你可以确保在编译时安全使用内存。以下是使用 Rust 在嵌入式设备上开发的一些好处:

强大的静态分析 灵活的内存 无畏的并发性 互操作性 可移植性 社区驱动

在这篇文章中,我使用开源的 RT-Thread 操作系统 来演示如何使用 Rust 进行嵌入式开发。

如何在 C 语言中调用 Rust

在 C 代码中调用 Rust 代码时,你必须将 Rust 源代码打包成静态库文件。当 C 代码编译时,将其链接进去。云服务器

用 Rust 创建一个静态库

在这个过程中,有两个步骤:

1、使用 cargo init --lib rust_to_c 在 Clion 中建立一个 lib 库。在 lib.rs 中加入以下代码。下面的函数计算两个类型为 i32 的值的总和并返回结果:

#![no_std]use core::panic::PanicInfo;#[no_mangle]pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b}#[panic_handler]fn panic(_info:&PanicInfo) -> !{ loop{}}

2、在你的 Cargo.toml 文件中添加以下代码,以告诉 Rustc 要生成什么类型的库:

[lib]name = "sum"crate-type = ["staticlib"]path = "src/lib.rs" 交叉编译

你可以针对你的目标平台进行交叉编译。假设你的嵌入式系统是基于 Arm 的,步骤很简单:

$ rustup target add armv7a-none-eabi

生成静态库文件:

$ cargo build --target=armv7a-none-eabi --release --verboseFresh rust_to_c v0.1.0Finished release [optimized] target(s) in 0.01s 生成头文件

你也需要头文件:

1、安装 cbindgen。cbindgen 工具会从 Rust 库中生成一个 C 或 C++11 的头文件:

$ cargo install --force cbindgen

2、在你的项目文件夹下创建一个新的 cbindgen.toml 文件。

3、生成一个头文件:

$ cbindgen --config cbindgen.toml --crate rust_to_c --output sum.h 调用 Rust 库文件

现在你可以对你的 Rust 库进行调用了。

1、把生成的 sum.h 和 sum.a 文件放到 rt-thread/bsp/qemu-vexpress-a9/applications 目录下。

2、修改 SConscript 文件并添加一个静态库:

   from building import *   cwd     = GetCurrentDir()   src     = Glob(*.c) + Glob(*.cpp)   CPPPATH = [cwd]   LIBS = ["libsum.a"]   LIBPATH = [GetCurrentDir()]   group = DefineGroup(Applications, src, depend = [], CPPPATH = CPPPATH, LIBS = LIBS, LIBPATH = LIBPATH)   Return(group)

3、在主函数中调用 sum 函数,亿华云计算得到返回值,并 printf 该值:

#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <rtthread.h> #include "sum.h" int main(void) { int32_t tmp; tmp = sum(1, 2); printf("call rust sum(1, 2) = %d\n", tmp); return 0; }

4、在 RT-Thread Env 环境中,使用 scons 来编译项目并运行:

$ scons -j6scons: Reading SConscript files ...scons: done reading SConscript files.scons: Building targets ...[...]scons: done building targets.$ qemu.sh \ | /- RT - Thread Operating System / | \ 4.0.4 build Jul 28 20212006 - 2021 Copyright by rt-thread teamlwIP-2.1.2 initialized![...]call rust sum(1, 2) = 3

加、减、乘、除

你可以在 Rust 中实现一些复杂的数学运算。在 lib.rs 文件中,使用 Rust 语言来实现加、减、乘、除:

#![no_std]use core::panic::PanicInfo;#[no_mangle]pub extern "C" fn add(a: i32, b: i32) -> i32 { a + b}#[no_mangle]pub extern "C" fn subtract(a: i32, b: i32) -> i32 { a - b}#[no_mangle]pub extern "C" fn multiply(a: i32, b: i32) -> i32 { a * b}#[no_mangle]pub extern "C" fn divide(a: i32, b: i32) -> i32 { a / b}#[panic_handler]fn panic(_info:&PanicInfo) -> !{ loop{}}

构建你的库文件和头文件,并把它们放在应用程序目录中。使用 scons 来编译。如果在链接过程中出现错误,请在官方 Github 页面 中找到解决方案。

修改 rtconfig.py 文件,并添加链接参数 --allow-multiple-definition:

DEVICE = -march=armv7-a -marm -msoft-float CFLAGS = DEVICE + -Wall AFLAGS = -c + DEVICE + -x assembler-with-cpp -D__ASSEMBLY__ -I. LINK_SCRIPT = link.lds LFLAGS = DEVICE + -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors,--allow-multiple-definition+\ -T %s % LINK_SCRIPT CPATH = LPATH =

编译并运行 QEMU 来看看你的工作。

在 Rust 中调用 C 语言

Rust 可以在 C 代码中调用,但是如何在你的 Rust 代码中调用 C 呢?下面是一个在 Rust 代码中调用 rt_kprintf C 函数的例子。

首先,修改 lib.rs 文件:

// The imported rt-thread functions list extern "C" { pub fn rt_kprintf(format: *const u8, ...); } #[no_mangle] pub extern "C" fn add(a: i32, b: i32) -> i32 { unsafe { rt_kprintf(b"this is from rust\n" as *const u8); } a + b }

接下来,生成库文件:

$ cargo build --target=armv7a-none-eabi --release --verboseCompiling rust_to_c v0.1.0Running `rustc --crate-name sum --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type staticlib --emit=dep-info,link -C opt-level=3 -C embed-bitcode=no -C metadata=aFinished release [optimized] target(s) in 0.11s

而现在,要运行代码,将 Rust 生成的库文件复制到应用程序目录中,然后重新构建:

$ scons -j6 scons: Reading SConscript files ... scons: done reading SConscript files. [...]scons: Building targets ... scons: done building targets.

再次运行 QEMU,可以在你的嵌入式镜像中看到结果。

你可以拥有这一切

在你的嵌入式开发中使用 Rust,你可以获得 Rust 的所有功能,而不需要牺牲灵活性或稳定性。今天就在你的嵌入式系统上试试 Rust 吧。关于嵌入式 Rust 的过程(以及 RT-Thread 本身)的更多信息,请查看 RT-Thread 项目的 YouTube 频道。请记住,嵌入式也可以是开放的。 

  • Tag:

相关文章

  • 解决电脑上网弹出证书错误的方法(探索证书错误的原因及应对之道)

    摘要:随着互联网的普及,我们越来越依赖于电脑上网。然而,有时候在上网过程中,我们可能会遇到一些证书错误的问题。这些错误会导致我们无法正常访问网页或受到安全风险。本文将深入探讨证书错误的原...
    2025-11-04
  • 开源代码带来的10大安全和运营风险

    Endor Labs 引入了OWASP风格的清单,列出了使用开源软件 (OSS) 中固有的最重要或影响最大的风险。OSS 的使用实际上是免费的,而且随时可用——它满足了软件开发中对速度和低成本的商业需
    2025-11-04
  • 使用数据库和Redis开发各系统独立的自增ID生成器

    背景使用业务场景:1.利用数据库自增主键生成唯一ID,无法满足各个系统独自生成自增的唯一ID需求。在分布式系统,需要生成唯一ID的系统不止一个,这些ID的生成在各自业务内是独立的,同时包含业务规则,如
    2025-11-04
  • 应对2023年不可避免的数据泄露的五个步骤

    如今,一些网络攻击者通过超越企业的创新技术,加快了攻击的步伐。因此,大规模的网络攻击在2023年将不可避免。在过去的两个月,T-Mobile公司、LastPass公司和弗吉尼亚联邦大学卫生系统都遭到了
    2025-11-04
  • 手工卡通电脑折纸教程(通过简单的折纸技巧,制作属于你自己的电脑卡通形象!)

    摘要:手工卡通电脑折纸是一种创意的手工艺活动,通过折纸技巧,可以制作出各种可爱有趣的卡通形象。本文将介绍一些简单的折纸教程,帮助读者轻松制作出属于自己的电脑卡通形象,让我们一起来体验这个...
    2025-11-04
  • 如何采用基于风险的方法应对网络安全威胁

    很多企业的网络安全战略已经落后,这并不是什么秘密。调研机构最近发布的一份报告发现,在迅速变化的威胁形势下,40%的首席安全官认为他们的企业并没有对网络安全做好充分的准备。这一统计数据表明,过去几年,数
    2025-11-04

最新评论