RT-Thread论坛
直播中

王超

8年用户 1396经验值
私信 关注
[问答]

请问如果运行rtt nano 3.1.5,除rv32i外哪些指令是必须的?

我需要在FPGA上搭载基于riscv的cpu,并运行rtt nano 3.1.5。cpu是自主开发的,只支持rv32i指令集。
   想请问如果运行rtt nano 3.1.5,除rv32i外哪些指令是必须的。

回帖(1)

丁冬芹

2025-9-11 17:55:49

为了在您自主开发的仅支持RV32I指令集的RISC-V CPU上运行RT-Thread Nano 3.1.5,除了基础RV32I指令外,必须通过软件模拟或硬件支持以下关键功能


1. 原子操作支持(A扩展指令)



  • 必要性:RT-Thread的线程同步(如互斥锁、信号量)依赖原子指令(如lr.wsc.w)。  

  • 解决方案:  

    • 硬件实现:直接支持RISC-V A扩展(原子指令)。  

    • 软件模拟:实现atomic相关函数(例如通过禁用全局中断+基础指令模拟原子操作),需修改RT-Thread源码(参考libcpu/risc-v/common/cpuport.c中的rt_hw_spin_lock等函数)。



2. CSR寄存器操作(Zicsr扩展)



  • 必要性:处理中断、异常和系统特权操作(如csrrwcsrrs指令)。  

  • 解决方案:  

    • 必须硬件支持CSR指令(Zicsr扩展)及关键寄存器:  

      • mtvec(异常入口地址)  

      • mepc/mcause(异常PC和原因)  

      • mstatus(全局中断开关)  

      • mie/mip(中断使能和挂起)  




3. 中断和异常处理机制



  • 硬件要求(非指令但必须实现):  

    • 实现机器模式(M-Mode)中断控制器。  

    • 时钟定时器(如CLINT或自定义定时器),用于系统节拍(tick)。  

    • 正确触发异常和中断的硬件逻辑。  



4. 乘除法运算(M扩展指令)



  • 必要性:内核调度、延时计算等可能涉及乘除操作(如muldiv指令)。  

  • 解决方案:  

    • 硬件实现:支持M扩展。  

    • 软件模拟:编译器生成__mulsi3等软函数(需在链接时包含libgcc的软实现)。  





总结与行动步骤





































功能 硬件指令扩展 软件替代方案 是否必需
原子操作 A扩展 禁用中断+基础指令模拟 必需
CSR操作 Zicsr扩展 无替代(必须硬件支持) 必需
中断/异常处理 - 实现CSR寄存器+中断控制器+定时器硬件 必需
乘除法 M扩展 链接libgcc软实现(编译器自动处理) 推荐硬件支持

具体修改建议




  1. 硬件调整:  



    • 扩展CPU支持 Zicsr指令 和必要的CSR寄存器。  

    • 可选添加 A扩展M扩展(否则需软件模拟,影响性能)。  




  2. 软件适配:  



    • 修改RT-Thread原子操作:若无A扩展,重写rtatomic.ccpuport.c中的锁机制(例如用中断开关+常规内存访问模拟原子操作)。  

    • 实现中断入口:在start.S中正确保存上下文,调用rt_interrupt_enter。  

    • 定时器驱动:实现tick中断(例如通过CLINT或自定义定时器)。  




  3. 编译配置:  



    • 指定目标为rv32i架构,确保编译器使用软浮点和软乘除(添加编译选项-march=rv32i -mabi=ilp32)。  





? 提示:参考RT-Thread官方risc-v移植代码(如libcpu/risc-v目录),重点关注context_gcc.S(上下文切换)、interrupt.c(中断处理)和tick.c(时钟)的实现。



通过上述调整,即使CPU仅支持RV32I核心指令集,也能运行RT-Thread Nano 3.1.5。但硬件支持A/M扩展和Zicsr将显著提升性能和简化开发。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分