Compile once, run everywhere!
RV-VEP (RISC-V Virtualized Embedded Platform) 的目标是实现嵌入式软件的“一次编译,到处运行”,抽象掉不同硬件指令集、不同 SoC 之间不必要的差别,使得构建一致的嵌入式软件生态成为可能。
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 的编译管线如下图所示:
为了使 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 要实现的目标。
Discussions