Compile once, run everywhere!

RV-VEP (RISC-V Virtualized Embedded Platform) 的目标是实现嵌入式软件的“一次编译,到处运行”,抽象掉不同硬件指令集、不同 SoC 之间不必要的差别,使得构建一致的嵌入式软件生态成为可能。

Why not WebAssembly?

RV-VC

RV-VC (RISC-V Virtualizable Code) 是定制化的 RISC-V 指令集,在 RV32IM 的基础上加入了元数据和扩展指令。RV-VC 是一种平台无关的中间表示,并不会由硬件直接执行,在烧录前需再进行一次编译,生成可以运行在目标硬件架构上的代码。

RV-VRT

RV-VRT (RISC-V Virtualized Runtime) 是在嵌入式设备上管理 RV-VC 代码执行的操作系统,它需要解决这些问题:

  • RV-VC 多模块的依赖解析和动态链接
  • 基于 URL 的一致化资源寻址
  • 提供对外设和中断的访问
  • etc.

Tasks

Task 1: LLVM RV-VC 编译后端

RV-VEP 的编译管线如下图所示:

Compile Pipeline

为了使 RV-VC -> 目标机器代码这一步完全静态化,我们需要在 LLVM IR -> RV-VC 这个流程里做改动,修改 LLVM RISC-V 后端以生成间接分支提示

Task 2: RV-VC -> Cortex-M 平台 (Thumb2) 的 AoT 编译器

Cortex-M 是目前工业上应用最广泛的微控制器系列,使用 Thumb2 指令集,所以首先实现 RV-VC 到 Thumb2 的编译器可以保证 RV-VC 可以运行在最多的硬件设备上。

建议基于 LLVM 实现,这样后期移植到其他平台会很方便;当然也可以选择手写 RV-VC 到 Thumb2 的二进制翻译逻辑 :)

Task 3: RV-VRT 操作系统

要为用户提供跨平台一致的开发体验,RV-VEP 不仅需要统一的二进制格式,也需要统一的模块接口硬件接口,这正是 RV-VRT 要实现的目标。