[MCU] 【平头哥Sipeed LicheeRV 86 Panel测评】使用新兴编程语言Rust开发RISCV裸机编程

mars4zhu   2022-4-19 09:18 楼主

使用新兴编程语言Rust开发RISCV裸机编程

 

目录

1. 前言 1

2. 搭建Rust语言开发环境 1

1.1 安装Rustupcargo环境 1

1.2 安装Riscv64嵌入式编程目标 1

3. 最简单rust嵌入式程序的构建和代码修改 2

4. Rust程序的编译、调试下载和运行 3

 

  1. 前言

Rust语言的运行效率高、开发效率好、适用范围广。作为一门编译型语言,它直接编译输出到汇编代码,通常公认裸机的Rust语言性能在C语言级别,拥有较高的运行效率。Rust语言的开发效率很高,文档完善、编译器提示有帮助,能节省软件开发所需的时间。它能应用在多个平台和指令集中,这包括裸机平台;处理核、操作系统厂家还可以提供自己的编译目标,无需厂家自己重新开发、提供工具链。

本着学习至上的精神,开始学习,并在开发板上编写并运行了最简单的Rust程序代码;

  1. 搭建Rust语言开发环境
    1. 安装Rustupcargo环境

按照rust官网安装指南,使用rustup方式安装即可。网上有详细的步骤过程,我在三套系统环境里都实现rust开发环境的搭建,分别是windows原生、windows-msys2WSL2Windows下的linux子系统);

rust官网安装太慢的话,可以用中科大或者清华大学的rustup源,网上也有很多参考信息,不再赘叙。

    1. 安装Riscv64嵌入式编程目标

按照如下命令添加riscv64-unknown-none-elftarget

rustup target list

rustup target add riscv64gc-unknown-none-elf

Set PATH=%PATH%;%PATH_TO_RISCV64-UNKNOWN-ELF-GCC%

cargo install cargo-binutils

rustup component add llvm-tools-preview

cargo install cargo-generate

其中PATH_TO_RISCV64-UNKNOWN-ELF-GCC是系统安装的编译riscv64-unknown-elf-gcc的目录路径,在linux或者msys2系统中,则改为export PATH=$PATH:$PATH_TO_RISCV64-UNKNOWN-ELF-GCC

 

  1. 最简单rust嵌入式程序的构建和代码修改

从模板中下载构建最简单的rust程序,

cargo generate --git https://github.com/riscv-rust/riscv-rust-quickstart

然后修改如下文件:

src/main.rs

#![no_std]

#![no_main]

 

extern crate panic_halt;

 

// use hifive1::hal::prelude::*;

// use hifive1::hal::DeviceResources;

use riscv_rt::entry;

 

#[entry]

fn main() -> ! {

    loop {}

}

 

cargo/config

[target.riscv64gc-unknown-none-elf]

runner = "riscv64-unknown-elf-gdb -q -x gdb_init"

rustflags = [

  "-C", "link-arg=-Tmemory.x",

  "-C", "link-arg=-Tlink.x",

]

 

[build]

target = "riscv64gc-unknown-none-elf"

 

memory.x

MEMORY

{

  /* NOTE 1 K = 1 KiBi = 1024 bytes */

  /* TODO Adjust these memory regions to match your device memory layout */

  /* These values correspond to the LM3S6965, one of the few devices QEMU can emulate */

  FLASH : ORIGIN = 0x00020000, LENGTH = 32K

  RAM : ORIGIN = 0x00028000, LENGTH = 64K

}

REGION_ALIAS("REGION_TEXT", FLASH);

REGION_ALIAS("REGION_RODATA", FLASH);

REGION_ALIAS("REGION_DATA", RAM);

REGION_ALIAS("REGION_BSS", RAM);

REGION_ALIAS("REGION_HEAP", RAM);

REGION_ALIAS("REGION_STACK", RAM);

 

gdb_init

set history save on

set confirm off

set remotetimeout 240

# 修改为T-Head DebugServergdb端口号:

target extended-remote :1025

set print asm-demangle on

monitor reset halt

load

continue

# quit

  1. Rust程序的编译、调试下载和运行

输入以下命令,即可完成编译、调试、下载和运行;

cargo build

cargo run

 

image-20220420162340-1.png  

 

下面三个图分别是在windowsmsys2WSL2-Ubuntu-20.04三个系统上的手动调试的过程截图:

 

image-20220420162340-2.png  

 

image-20220420162340-3.png  

 

image-20220420162340-4.png  

 

不过貌似学习路径应该是先在电脑上学习Rust语法和程序结构,熟悉之后再慢慢渗透到嵌入式编程领域,我这样贸然直接在RISCV芯片上动手写Rust裸机代码,步子跨得有点大,连LED-Blinky点灯程序或者UART输出“HelloWorld”都有点困难;

全志的这颗RISCV64芯片,是这段时间最便宜实惠的RISCV64架构能运行Linux系统的SoC,然后网上有很多利用D1芯片做教学,如“挪威科技大学使用全志D1哪吒开发板开设操作系统课程”,公开课件——Porting the xv6 OS to the Nezha D1 RISC-V Board.pdf

奋勇而上,得慢慢来,一步一个脚印学习,实现最终目的——将清华大学计算机系本科操作系统课程的rCore移植到D1上;

 

使用新兴编程语言Rust开发RISCV裸机编程.zip (1.54 MB)
(下载次数: 1, 2022-4-20 16:29 上传)

 

本帖最后由 mars4zhu 于 2022-4-20 16:29 编辑

回复评论 (5)

图文啥时补充呀:)

加油!在电子行业默默贡献自己的力量!:)
点赞  2022-4-20 10:38
引用: soso 发表于 2022-4-20 10:38 图文啥时补充呀:)

补充好了,帮我审核一下啊。

点赞  2022-4-20 16:30

接触不多,但我觉得以后Rust语言会比C语言在单片机、嵌入式系统、裸机uni-kernel等领域,要更加流行且重要。

点赞  2022-4-20 16:45

这个要支持,现在rust风头好像挺猛。

默认摸鱼,再摸鱼。2022、9、28
点赞  2022-4-20 18:44
引用: freebsder 发表于 2022-4-20 18:44 这个要支持,现在rust风头好像挺猛。

我也是最近才发现的。

点赞  2022-4-21 23:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复