成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Rust 進(jìn)行嵌入式開發(fā)

開發(fā) 后端
Rust 的高性能、高可靠性和高生產(chǎn)力使它適合于嵌入式系統(tǒng)。在過去的幾年里,Rust 在程序員中獲得了熱情的追捧。技術(shù)潮流來來去去,所以很難將僅僅因?yàn)槟稠?xiàng)新技術(shù)而產(chǎn)生的興奮與對某項(xiàng)技術(shù)的優(yōu)點(diǎn)的興奮區(qū)分開來,但我認(rèn)為 Rust 是一種真正設(shè)計(jì)良好的語言。

[[431350]]

Rust 的高性能、高可靠性和高生產(chǎn)力使它適合于嵌入式系統(tǒng)。

在過去的幾年里,Rust 在程序員中獲得了熱情的追捧。技術(shù)潮流來來去去,所以很難將僅僅因?yàn)槟稠?xiàng)新技術(shù)而產(chǎn)生的興奮與對某項(xiàng)技術(shù)的優(yōu)點(diǎn)的興奮區(qū)分開來,但我認(rèn)為 Rust 是一種真正設(shè)計(jì)良好的語言。它的目標(biāo)是幫助開發(fā)者建立可靠和高效的軟件,而且它從一開始就是為這個(gè)目的設(shè)計(jì)的。你可能聽過一些 Rust 的關(guān)鍵特性,在這篇文章中,我會(huì)證明這些特性正是 Rust 也恰好適合嵌入式系統(tǒng)的原因。比如:

  • 高性能:它速度快,內(nèi)存利用率高
  • 可靠性:在編譯過程中可以消除內(nèi)存錯(cuò)誤
  • 生產(chǎn)力:很棒的文檔,友好的編譯器,有用的錯(cuò)誤信息,以及一流的工具化。它有一個(gè)集成的包管理器和構(gòu)建工具,智能的多編輯器支持自動(dòng)補(bǔ)完和類型檢查、自動(dòng)格式化等等。

為什么使用 Rust 進(jìn)行嵌入式開發(fā)?

Rust 的設(shè)計(jì)是為了保證安全和高性能。嵌入式軟件會(huì)出現(xiàn)的問題主要是內(nèi)存的問題。從某種程度上說,Rust 是一種面向編譯器的語言,所以你可以確保在編譯時(shí)安全使用內(nèi)存。以下是使用 Rust 在嵌入式設(shè)備上開發(fā)的一些好處:

  • 強(qiáng)大的靜態(tài)分析
  • 靈活的內(nèi)存
  • 無畏的并發(fā)性
  • 互操作性
  • 可移植性
  • 社區(qū)驅(qū)動(dòng)

在這篇文章中,我使用開源的 RT-Thread 操作系統(tǒng) 來演示如何使用 Rust 進(jìn)行嵌入式開發(fā)。

如何在 C 語言中調(diào)用 Rust

在 C 代碼中調(diào)用 Rust 代碼時(shí),你必須將 Rust 源代碼打包成靜態(tài)庫文件。當(dāng) C 代碼編譯時(shí),將其鏈接進(jìn)去。

用 Rust 創(chuàng)建一個(gè)靜態(tài)庫

在這個(gè)過程中,有兩個(gè)步驟:

1、使用 cargo init --lib rust_to_c 在 Clion 中建立一個(gè) lib 庫。在 lib.rs 中加入以下代碼。下面的函數(shù)計(jì)算兩個(gè)類型為 i32 的值的總和并返回結(jié)果:

  1. #![no_std]
  2. use core::panic::PanicInfo;
  3.  
  4. #[no_mangle]
  5. pub extern "C" fn sum(a: i32, b: i32) -> i32 {
  6. a + b
  7. }
  8.  
  9. #[panic_handler]
  10. fn panic(_info:&PanicInfo) -> !{
  11. loop{}
  12. }

2、在你的 Cargo.toml 文件中添加以下代碼,以告訴 Rustc 要生成什么類型的庫:

  1. [lib]
  2. name = "sum"
  3. crate-type = ["staticlib"]
  4. path = "src/lib.rs"

交叉編譯

你可以針對你的目標(biāo)平臺(tái)進(jìn)行交叉編譯。假設(shè)你的嵌入式系統(tǒng)是基于 Arm 的,步驟很簡單:

  1. $ rustup target add armv7a-none-eabi

生成靜態(tài)庫文件:

  1. $ cargo build --target=armv7a-none-eabi --release --verbose
  2. Fresh rust_to_c v0.1.0
  3. Finished release [optimized] target(s) in 0.01s

生成頭文件

你也需要頭文件:

1、安裝 cbindgencbindgen 工具會(huì)從 Rust 庫中生成一個(gè) C 或 C++11 的頭文件:

  1. $ cargo install --force cbindgen

2、在你的項(xiàng)目文件夾下創(chuàng)建一個(gè)新的 cbindgen.toml 文件。

3、生成一個(gè)頭文件:

  1. $ cbindgen --config cbindgen.toml --crate rust_to_c --output sum.h

調(diào)用 Rust 庫文件

現(xiàn)在你可以對你的 Rust 庫進(jìn)行調(diào)用了。

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

2、修改 SConscript 文件并添加一個(gè)靜態(tài)庫:

  1.    from building import *
  2.    
  3.    cwd     = GetCurrentDir()
  4.    src     = Glob('*.c') + Glob('*.cpp')
  5.    CPPPATH = [cwd]
  6.    
  7.    LIBS = ["libsum.a"]
  8.    LIBPATH = [GetCurrentDir()]
  9.    
  10.    group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, LIBS = LIBS, LIBPATH = LIBPATH)
  11.    
  12.    Return('group')

3、在主函數(shù)中調(diào)用 sum 函數(shù),得到返回值,并 printf 該值:

  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <rtthread.h>
  5. #include "sum.h"
  6. int main(void)
  7. {
  8. int32_t tmp;
  9. tmp = sum(1, 2);
  10. printf("call rust sum(1, 2) = %d\n", tmp);
  11. return 0;
  12. }

4、在 RT-Thread Env 環(huán)境中,使用 scons 來編譯項(xiàng)目并運(yùn)行:

  1. $ scons -j6
  2. scons: Reading SConscript files ...
  3. scons: done reading SConscript files.
  4. scons: Building targets ...
  5. [...]
  6. scons: done building targets.
  7.  
  8. $ qemu.sh
  9. \ | /
  10. - RT - Thread Operating System
  11. / | \ 4.0.4 build Jul 28 2021
  12. 2006 - 2021 Copyright by rt-thread team
  13. lwIP-2.1.2 initialized!
  14. [...]
  15. call rust sum(1, 2) = 3

加、減、乘、除

你可以在 Rust 中實(shí)現(xiàn)一些復(fù)雜的數(shù)學(xué)運(yùn)算。在 lib.rs 文件中,使用 Rust 語言來實(shí)現(xiàn)加、減、乘、除:

  1. #![no_std]
  2. use core::panic::PanicInfo;
  3.  
  4. #[no_mangle]
  5. pub extern "C" fn add(a: i32, b: i32) -> i32 {
  6. a + b
  7. }
  8.  
  9. #[no_mangle]
  10. pub extern "C" fn subtract(a: i32, b: i32) -> i32 {
  11. a - b
  12. }
  13.  
  14. #[no_mangle]
  15. pub extern "C" fn multiply(a: i32, b: i32) -> i32 {
  16. a * b
  17. }
  18.  
  19. #[no_mangle]
  20. pub extern "C" fn divide(a: i32, b: i32) -> i32 {
  21. a / b
  22. }
  23.  
  24. #[panic_handler]
  25. fn panic(_info:&PanicInfo) -> !{
  26. loop{}
  27. }

構(gòu)建你的庫文件和頭文件,并把它們放在應(yīng)用程序目錄中。使用 scons 來編譯。如果在鏈接過程中出現(xiàn)錯(cuò)誤,請?jiān)诠俜?nbsp;Github 頁面 中找到解決方案。

修改 rtconfig.py 文件,并添加鏈接參數(shù) --allow-multiple-definition

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

編譯并運(yùn)行 QEMU 來看看你的工作。

在 Rust 中調(diào)用 C 語言

Rust 可以在 C 代碼中調(diào)用,但是如何在你的 Rust 代碼中調(diào)用 C 呢?下面是一個(gè)在 Rust 代碼中調(diào)用 rt_kprintf C 函數(shù)的例子。

首先,修改 lib.rs 文件:

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

接下來,生成庫文件:

  1. $ cargo build --target=armv7a-none-eabi --release --verbose
  2. Compiling rust_to_c v0.1.0
  3. Running `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=a
  4. Finished release [optimized] target(s) in 0.11s

而現(xiàn)在,要運(yùn)行代碼,將 Rust 生成的庫文件復(fù)制到應(yīng)用程序目錄中,然后重新構(gòu)建:

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

再次運(yùn)行 QEMU,可以在你的嵌入式鏡像中看到結(jié)果。

你可以擁有這一切

在你的嵌入式開發(fā)中使用 Rust,你可以獲得 Rust 的所有功能,而不需要犧牲靈活性或穩(wěn)定性。今天就在你的嵌入式系統(tǒng)上試試 Rust 吧。關(guān)于嵌入式 Rust 的過程(以及 RT-Thread 本身)的更多信息,請查看 RT-Thread 項(xiàng)目的 YouTube 頻道。請記住,嵌入式也可以是開放的。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2022-02-14 23:17:16

Gitlab嵌入式工具

2011-01-14 13:13:23

嵌入式Linux開發(fā)

2009-07-17 16:06:59

ARM嵌入式開發(fā)

2010-01-13 09:15:35

嵌入式

2011-07-05 15:42:02

QT 嵌入式 Embedded

2009-12-23 10:33:30

Silverlight

2011-01-06 15:11:09

嵌入式linux

2011-06-13 14:00:55

Qt Designer linux

2010-01-06 09:53:08

嵌入式

2020-03-23 10:15:10

Google 開源技術(shù)

2021-12-24 17:01:29

Linux工具系統(tǒng)

2020-06-15 07:00:00

Linux嵌入式系統(tǒng)

2010-01-13 09:51:21

微軟Linux嵌入式

2022-03-11 15:44:11

嵌入式開發(fā)技巧技術(shù)

2021-10-28 19:23:27

界面嵌入式 UI

2017-08-14 15:01:19

2011-06-09 10:28:54

QT 嵌入式

2011-06-21 11:30:31

嵌入式 Qt

2009-12-09 10:12:28

嵌入式Linux

2009-12-17 10:33:05

嵌入式Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 激情视频中文字幕 | 国产无套一区二区三区久久 | 日本一卡精品视频免费 | 国产精品婷婷 | 亚洲精品99999 | 国产性生活一级片 | 91色啪 | 第四色狠狠 | 免费亚洲成人 | 日韩欧美亚洲 | 亚洲一区二区免费 | 免费中文字幕日韩欧美 | 91视频国产精品 | 久久久123 | 国产在线高清 | 欧美日韩精品一区二区三区四区 | 国产一区二区三区日韩 | 一区二区三区四区国产 | 色资源在线 | 欧美日韩国产一区二区三区 | 亚洲电影一区 | 国产精品一区二区三区在线 | 91精品国产91久久久久久密臀 | 日本人和亚洲人zjzjhd | 精品视频在线免费观看 | 久久99精品视频 | 亚洲精品福利在线 | 91xh98hx 在线 国产 | 久久久久久久av | 欧美精品在线一区二区三区 | 久久国产精品99久久久大便 | 91精品国产自产精品男人的天堂 | 精品久久久久一区二区国产 | 国产乱码精品1区2区3区 | 久久精品99 | 久久99国产精品 | 欧美一区二区三区四区视频 | 涩涩视频在线看 | 成人一区在线观看 | 国产精品国产a级 | 久久成人久久 |