[RISC-V]移植rtthread nano到risc-v芯片
本文由RT-Thread论坛用户@DENGCHOW原创发布:https://club.rt-thread.org/as...
“这么说吧,就是为了这口醋,我才包的这顿饺子。”仓库地址:https://gitee.com/dengchow/yu...
〇、前言 本文记录的是在 risc-v 芯片上移植 rt-thread nano 的过程。
使用到的 risc-v 芯片是玉衡(YuHeng,yuheng-riscv),一款并不存在于现实世界的芯片,同 picorv32 和 darkriscv 一样,仅存在与仿真环境中。
一、硬件平台 玉衡(YuHeng,yuheng-riscv)基于开源 RISC-V 指令集架构,是一款极简的 32 位 RISC-V 处理器核。仅用于检测和实验。
玉衡不具备任何商用价值,但可以作为很好的学习平台。
使用玉衡,能够很好的了解计算机体系结构、操作系统、通信协议、编译原理等相关知识。
另外,所有的运行环境均为精简搭建,因此还可以很轻易的熟悉搭建过程。
不仅会用,还要知道为什么会用。是当初设计的初衷。
特点与功能
- 支持 RV32IMFD 扩展指令集,通过RISC-V指令兼容性测试
- 采用五级流水线设计:IF、ID、EX、MEM、WB
- 采用自定义的总线设计:RBM(RISC-V Bus Matrix)
- 支持中断:矢量中断和非矢量中断
- 支持多种外设: UART、TIMER 等
- 支持 C 程序运行
- 支持 RT-Thread Nano 3.1.5
- 支持 UART 模拟器,可在仿真环境中进行调试
- ...
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/e48b4e99bc344c85a93092046d481d1d.jpg)
文章图片
之所以不使用完整版 rt-thread,是因为我个人认为 rt-thread 的精华是 kernel 和 FinSH。
因此 rtthread nano 足够了。
其实根本的原因是 YuHeng 上只有最最基本的外设,除了 UART 就是 TIMER。惭愧。
三、移植过程 移植过程比较特殊,因为是先有的 rtthread nano,然后才去改造的 yuheng-riscv。
最终效果
- 使用项目中给出的运行脚本,可以直接创建出 Vivado 工程。
- 为了方便 Simulation,设计一个 uart_monitor,有了它之后,就可以直接在 testbench 中捕捉 UART 的输出。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/1c1c5e1602744d63bd053fcac8c506d3.gif)
文章图片
- 仿真是比较慢的。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/8fc5819953424636a10227331683ef6b.gif)
文章图片
- 由于是在 Vivado 上进行 Simulation,可以监视任何一个信号。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/4d6c8ae4d5de486d9db9a8fa720fed6b.gif)
文章图片
- 从 wave 和 log 两个角度进行结果输出。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/6867f15c4e6749ec8fe9cb037c7675be.gif)
文章图片
接下来,介绍一下移植过程。
移植过程
rtthread 调度线程的时候使用到
rt_hw_context_switch
和 rt_hw_context_switch_to
两个函数。而这两个函数实际并没有真的去切换线程,在 ARM Cortex 中会触发 PendSV 中断,在 PendSV 中完成的线程切换。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/7b78a31742ea4711bcbfa2c296542138.jpg)
文章图片
在中科蓝讯的 ab32vg1 中,是有一个 low_prio_irq 的,作用和 PendSV 是一样的。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/9fa11282730046149bb385187a766dc1.jpg)
文章图片
很尴尬, yuheng-riscv 中是没有类似的设置。
在设计 yuheng-riscv 是只有非矢量中断的,即只有一个固定的中断 trap_handler,然后通过软件来构建中断向量表。
如
sdk\rtthread-nano\interrupt.c
中所示。![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/175d67668ba340d080b41f5d3b3b442b.png)
文章图片
本着尽量不改动 rtthread nano 源码的出发点,决定对 yuheng-riscv 的中断机制进行修改。
- 增加硬件中断向量表。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/dce3f935c1544dfd85ebbe1f60432fd3.png)
文章图片
- 增加 soft_handler 中断用于线程切换。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/367766b97b77482eb3e983e346f533ae.png)
文章图片
剩余的移植工作如 tick 的添加, UART 的添加,这个就不做介绍了,毕竟 rtthread nano 中通过 TODO 都进行标识了。
一步一步的修改添加即可。
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/8be6ac0e6028405d854f32382076f1d0.png)
文章图片
四、总结 总之,rtthread 还是很友好的。
整体来说 yuheng-riscv 还只是一个 demo,功能是有了,性能还是差不少。
“醋还行,饺子差点。”【[RISC-V]移植rtthread nano到risc-v芯片】
![[RISC-V]移植rtthread nano到risc-v芯片](https://img.it610.com/image/info9/bfc4fd108e164409bffc7f72317d1fd7.jpg)
文章图片
推荐阅读
- 三宝成功抢救大宝中国干细胞组,另一例脐血造血干细胞移植
- LUA|单片机脚本语言移植lua到stm32MDK
- windows下RISC-V编译调试环境搭建
- linux移植过程出现“can't open /dev/tq2440_serial0: No such file or directory”
- PC/SC在android上的移植
- S905X|S905X 7.1 RTC_AM1805 移植 F&Q
- linux|【原创】ARM LINUX 外部RTC实时时钟驱动移植(RX8025)
- Felven在职场|Zynq-Linux移植学习笔记之44-linux下watchdog示例
- 不同平台下移植x264
- rk3128 平台rk818电源管理驱动移植