Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
QEMU
risc-v_RISCV
RISC-V RV64ILP32工具链适配RT-Thread
发布于 2024-07-26 14:09:18 浏览:300
订阅该版
[tocm] # RISC-V RV64ILP32工具链适配RT-Thread ## 简介 达摩院-玄铁团队提出了松弛扩展寻址模式(Relaxed-Addressing Mode),并与中科院软件所-PLCT实验室联合发布了业界首款RISC-V新32位产品级开源工具链(rv64ilp32 toolchain),新32位工具链基于 RISC-V 64ilp32 ABI,融合了松弛扩展寻址技术,让64位硬件流畅运行新32位软件,RT-Thread基于qemu-virt64-riscv bsp适配了该工具链。 - qemu-virt64-riscv bsp:https://github.com/RT-Thread/rt-thread/tree/master/bsp/qemu-virt64-riscv - 新32位工具链(rv64ilp32):https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/releases ## 1 什么是RV64ILP32? RV64顾名思义是指当前使用的平台是RISC-V64的平台。那么ILP32指什么? ### 1.1 -mabi的作用? RISC-V GCC通过-mabi选项指定数据模型和浮点参数传递规则。有效的选项值包括ilp32、ilp32f、ilp32d、lp64、lp64f 和 lp64d。前半部分指定`数据模型`,后半部分指定浮点参数传递规则。 > `i`指`int`,`l`指`long`,`p`指`pointer`即指针,`32/64`指前面给出的类型是`32/64`位的;`f`指`float`,指`float`型浮点数参数通过浮点数寄存器传递;`d`指`double`,指`floa`t型和`double`型浮点数参数通过浮点数寄存器传递。 数据模型: | | int字长 | long字长 | 指针字长 | | :-----------------: | :-----: | :------: | :------: | | ilp32/ilp32f/ilp32d | 32bits | 32bits | 32bits | | lp64/lp64f/lp64d | 32bits | 64bits | 64bits | 浮点参数传递规则: | | 需要浮点扩展指令? | float参数 | double参数 | | :----------: | :----------------: | :-------------------------: | :-------------------------: | | ilp32/lp64 | 不需要 | 通过整数寄存器(a0-a1)传递 | 通过整数寄存器(a0-a3)传递 | | ilp32f/lp64f | 需要F扩展 | 过浮点寄存器(fa0-fa1)传递 | 通过整数寄存器(a0-a3)传递 | | ilp32d/lp64d | 需要F扩展和D扩展 | 过浮点寄存器(fa0-fa1)传递 | 过浮点寄存器(fa0-fa1)传递 | 浮点参数传递规则只跟`-mabi`选项有关,和`-march`选项没有直接关系,但是部分`-mabi`选项需要浮点寄存器,浮点寄存器是通过浮点扩展指令引入的,这就需要在`-march`选项中指定浮点扩展。 ## 2 RT-Thread适配rv64ilp32工具链 当前系统是基于常规的arch与abi设计,在使用rv64ilp32工具链直接编译生成的固件则不能正常运行,更不能在之前的常规的qemu上运行。所为了能够把使用rv64ilp32工具链编译的rtthread固件在qemu上运行起来,需要做一些调整,rt-thread的bsp目录下的`qemu-virt64-riscv`bsp适配了riscv64的qemu,所以我们在该bsp的基础上进行修改,进行rv64ilp32工具链的支持。 ### 2.1 修改编译参数mabi 修改前: ```python DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64 ' ``` 修改后: ```python DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=ilp32d ' ``` 使用ilp32d参数后,编译后代码的数据类型将使用上述1.1的数据类型的长度。 ### 2.2 添加寄存器数据类型 ```c #if defined(RT_USING_RV64ILP32) typedef unsigned long long rt_uintreg_t; #else typedef unsigned long rt_uintreg_t; #endif ``` 在原有的bsp下操作寄存器的的数据类型为`rt_size_t`,当前系统该数据类型为`unsigned long`,使用`-mabi=ilp32d`后该数据类型的长度为32bit,该长度无法用于缓存64bit寄存器的数据,所以在最小的改动前提下,定义上述的寄存器数据类型; ### 2.3 修改缓存寄存器参数的数据类型 rt-thread在初始化栈帧时使用`rt_ubase_t`类型作为寄存器的数据类型,在`-mabi=ilp32d`下该数据类型的长度为32bit,所以将涉及寄存器的数据类型都需要修改为`rt_uintreg_t`.修改示例: 修改前 ```c rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { rt_ubase_t *sp = (rt_ubase_t *)stack_addr; // we use a strict alignment requirement for Q extension sp = (rt_ubase_t *)RT_ALIGN_DOWN((rt_ubase_t)sp, 16); (*--sp) = (rt_ubase_t)tentry; (*--sp) = (rt_ubase_t)parameter; (*--sp) = (rt_ubase_t)texit; /* compatible to RESTORE_CONTEXT */ extern void _rt_thread_entry(void); return (rt_uint8_t *)_rt_hw_stack_init(sp, (rt_ubase_t)_rt_thread_entry, K_SSTATUS_DEFAULT); } ``` 修改后: ```c rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { rt_uintreg_t *sp = (rt_uintreg_t *)stack_addr; // we use a strict alignment requirement for Q extension sp = (rt_uintreg_t *)RT_ALIGN_DOWN((rt_uintreg_t)sp, 16); (*--sp) = (rt_uintreg_t)tentry; (*--sp) = (rt_uintreg_t)parameter; (*--sp) = (rt_uintreg_t)texit; /* compatible to RESTORE_CONTEXT */ extern void _rt_thread_entry(void); return (rt_uint8_t *)_rt_hw_stack_init(sp, (rt_uintreg_t)_rt_thread_entry, K_SSTATUS_DEFAULT); } ``` 详细的修改步骤参考:https://github.com/RT-Thread/rt-thread/pull/9194 ## 3 在RT-Thread中使用`rv64ilp32`工具链编译运行`qemu-virt64-riscv`BSP ### 3.1 配置工程 - 配置工具链路径: 修改EXEC_PATH为rv64ilp32工具链路径 - 修改ABI参数为:-mabi=ilp32d - 使用menuconfig使能下述选项: ```shell RT_USING_RV64ILP32 ``` - 使用menuconfig失能下述选项: ```shell RT_USING_POSIX_PIPE RT_USING_POSIX_FS RT_USING_DFS ``` ### 3.2 运行工程 执行`./qemu-rv64ilp32-nographic.sh`在`qemu-system-riscv64ilp32`上运行固件。 运行结果: ```shell \ | / - RT - Thread Operating System / | \ 5.2.0 build Jul 26 2024 13:49:10 2006 - 2024 Copyright by RT-Thread team lwIP-2.0.3 initialized! [I/sal.skt] Socket Abstraction Layer initialize success. [I/utest] utest is initialize success. [I/utest] total utest testcase num: (0) Hello RISC-V msh >ps thread pri status sp stack size max used left tick error tcb addr ------------------------ --- ------- ---------- ---------- ------ ---------- ------- ---------- tshell 20 running 0x000001e0 0x00004000 06% 0x0000000a OK 0x80279d98 sys workq 23 suspend 0x00000158 0x00002000 04% 0x0000000a OK 0x80277870 tcpip 10 suspend 0x00000208 0x00002000 07% 0x00000014 EINTRPT 0x802756e0 etx 12 suspend 0x000001a8 0x00002000 05% 0x00000010 EINTRPT 0x80263e00 erx 12 suspend 0x000001a8 0x00002000 05% 0x00000010 EINTRPT 0x80265f40 tidle0 31 ready 0x000002d0 0x00004000 07% 0x00000011 OK 0x802688f8 timer 4 suspend 0x000001a0 0x00004000 02% 0x0000000a EINTRPT 0x8026ccc0 ``` 感兴趣的伙伴快尝试起来叭!!!
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
rv666
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
文章
20
回答
56
被采纳
9
关注TA
发私信
相关文章
1
Linux下的Qemu mini2440虚拟机(32位和64位)
2
有qemu Linux的rt-thread开发环境建立吗?
3
qemu+mini2440+bootloader问题
4
QEMU gdbstub 在Win7下的bug
5
请教如何在windows下使用qemu测试rrt0.31中的例子
6
QEMU运行os问题
7
QEMU-mini2440 模拟环境上运行RT-thread这篇
8
在Ubuntu上执行qemu的configure命令checkzlib失败
9
求大舅:telnet-连接QEMU时,QEMU segmentation fault 结束
10
RealTouch打算出QEMU模拟器吗
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部