ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RT-Thread 在超睿 UR-DP1000 多核 RISC-V SoC 上的 BSP 移植与实战指南

RT-Thread 在超睿 UR-DP1000 多核 RISC-V SoC 上的 BSP 移植与实战指南 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载本篇技术指南以 RT-Thread 仓库中 ur_dp1000_evb BSP 使用说明 为主体系统讲解超睿科技UltrariscUR-DP1000 高性能多核 RISC-V SoC 的芯片特性、BSP 外设支持情况、Linux 环境下的工具链配置与编译流程以及通过 JTAG/OpenOCD/GDB 将 RT-Thread 标准版与 Smart 版本加载到开发板运行的完整方法。读完本文你将能够独立完成 UR-DP1000 EVB 上 RT-Thread 镜像的构建、加载与串口验证并从源码层面理解该 BSP 的 MMU、PLIC 中断控制器与 UART 驱动实现。1. 概述面向高性能多核 RISC-V 的 RT-Thread BSPUR-DP1000 是超睿科技研发的高性能多核 RISC-V SoC集成了 8 个自研 RISC-V 处理器核 UR-CP100同时集成 24 路 PCIe 4.0、双路 DDR4 以及 SPI、UART、QSPI、GMAC、I2C、PWM、GPIO 等丰富的低速接口。本 BSP 对应 UR-DP1000 EVB 开发板板卡集成 16GB DDR4 内存使用该 BSP 编译生成的 RT-Thread 标准版与 RT-Thread Smart 版本均可运行在 UR-DP1000 EVB 上从而覆盖裸机实时内核与微内核 用户态两种典型应用形态。从仓库目录结构看该 BSP 由三部分组成BSP 工程主体含board/板级初始化、applications/应用入口与挂载逻辑、链接脚本与 rtconfig 配置处理器核架构代码UR-CP100 核相关的 cache、中断、PLIC 与 RISC-V MMU 支持片上外设驱动UART 与 Designware APB SSISPI驱动。2. 芯片规格说明原文档给出的 UR-DP1000 关键硬件规格如下| 硬件 | 描述 | | -- | -- | | 芯片型号 | UR-DP1000 | | CPU | 8 核 UR-CP10064 位乱序发射超标量微架构支持 rv64imafdchx 指令集支持虚拟化扩展 | | 主频 | 2.0-2.3GHz | | Cache | 核内集成 64KB L1I 和 64KB L1D Cache 以及 512KB L2 Cache | | 内存 | 支持两路 DDR4支持 ECC最大支持内存容量 128GB | | 高速接口 | 支持 24 路 PCIe 4.0 接口 | | 低速接口 | SPI、UART、QSPI、UART、GMAC、I2C、PWM、GPIO 等 |该规格与 BSP 启动阶段 OpenSBI 打印的运行时信息相互印证Boot HART Base ISA: rv64imafdchx、Boot HART PMP Count: 4、Platform HART Count: 8、Platform Timer Device: aclint-mtimer 10000000Hz详见第 6 节串口输出。在 rtconfig.py 中编译架构被指定为ARCH risc-v、CPU ur-cp100GCC 编译选项使用-marchrv64gc -mabilp64 -mcmodelmedany与 64 位 RISC-V 双模式S-mode/U-mode运行环境相匹配。3. BSP 外设支持设备名称支持情况说明PLIC支持中断控制器CLINT支持RISC-V core local 中断控制器系统时钟及核间中断依赖该设备MMU支持支持 SV39支持 ASIDUART支持调试串口SPI支持Designware apb ssi支持 TF 卡驱动3.1 中断控制器 PLIC 的实现UR-CP100 核架构代码 interrupt.c 中rt_hw_interrupt_init()将全部irq_desc[]初始化为默认处理函数后调用plic_init()。PLIC 驱动 plic.c 完成以下初始化将 PLIC 基地址映射 64MB 空间rt_ioremap(plic_base, 64 * 1024 * 1024)设置全局中断阈值plic_set_threshold(0)即允许所有非零优先级中断为 1 至CONFIG_IRQ_NR的所有中断源设置统一优先级 1关闭全部中断后再使能sie寄存器中的MIP_SEIP外部中断位。PLIC 的优先级与阈值语义在源码注释中有明确定义最大优先级为 7优先级 0 表示永不中断等效禁用相同优先级的中断按中断 ID 裁决ID 越小有效优先级越高见 plic.c。针对 UR-DP1000 的多核场景plic.c 还实现了基于is_irqs_pending()/restore_irqs_enable()的按 hart 使能位保存恢复机制保证中断处理期间不会丢失其他 pending 中断。BSP 默认配置中 PLIC 基地址为0x9000000支持中断数为 160定义在 rtconfig.h并在 board/Kconfig 中可通过Ultrarisc DP1000 Soc Drivers Configuration - Using PLIC菜单调整。3.2 时钟与 MMUrt_hw_get_clock_timer_freq()在 board.c 中返回10000000ULL与 OpenSBI 打印的aclint-mtimer 10000000Hz一致系统时钟节拍tick即基于该 10MHz 的 CLINT 定时器。MMU 支持 SV39 分页与 ASID地址空间标识符由ARCH_MM_MMU、ARCH_USING_ASID宏使能见 rtconfig.h。在 RT-Thread Smart 模式下board.c 会依次执行rt_hw_mmu_map_init()、rt_page_init()与rt_hw_mmu_setup()为内核建立页表并启动分页机制。3.3 UART 调试串口UART0 作为默认调试串口其关键参数定义在 rtconfig.h配置项值含义UART0_BASE_ADDR0x20310000UART0 寄存器基地址MMIOUART0_IRQ_BASE18UART0 中断号UART0_REFERENCE_CLOCK62500000UART0 参考时钟HzUART0_DEFAULT_BAUDRATE115200默认波特率UART0_REG_SHIFT2寄存器地址移位同时RT_CONSOLE_DEVICE_NAME定义为uart0rtconfig.h板级初始化时通过rt_hw_uart_init()注册串口驱动并以rt_console_set_device(RT_CONSOLE_DEVICE_NAME)挂接控制台见 board.c因此运行日志中会打印Using /dev/ttyS0 as default console。4. 编译RT-Thread 对该 BSP 的编译仅支持 Linux 环境官方推荐 Ubuntu 22.04。4.1 工具链下载与解压从 RT-Thread 官方下载站获取riscv64-linux-musleabi交叉编译工具链压缩包适用于 x86_64 Linux 主机解压到指定路径例如# 解压到 /opt/riscv64gc-linux-musleabi_for_x86_64-pc-linux-gnu tar xjf riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_251248.tar.bz2 -C /opt该工具链基于 musl libc可同时支撑 RT-Thread 标准版与 Smart用户态版本的链接需求。4.2 设置编译环境变量在 shell 中导出以下两个环境变量scons构建脚本会读取它们来确定编译器路径与前缀export RTT_EXEC_PATH/opt/riscv64gc-linux-musleabi_for_x86_64-pc-linux-gnu/bin export RTT_CC_PREFIXriscv64-unknown-linux-musl-对应地rtconfig.py 中EXEC_PATH默认取RTT_EXEC_PATH缺省/usr/binPREFIX默认riscv64-unknown-elf-通过RTT_CC_PREFIX覆盖为riscv64-unknown-linux-musl-后CC、CXX、AR、LINK、OBJCPY等工具均以该前缀组合生成。4.3 安装编译依赖sudo apt install scons python3-pip pip install kconfiglibscons是 RT-Thread 的构建引擎kconfiglib用于支撑scons --menuconfig图形化配置。4.4 编译标准版git clone https://gitcode.com/gh_mirrors/rt/rt-thread cd bsp/ultrarisc/ur_dp1000_evb # 默认为 RT-Thread 标准版 scons编译完成后在bsp/ultrarisc/ur_dp1000_evb目录下生成rt-thread.elf带调试信息的 ELF及rtthread.bin裸二进制镜像。后者的生成由 rtconfig.py 的POST_ACTION定义objcopy -O binary $TARGET rtthread.bin同时-Maprtthread.map会输出符号映射表便于排查链接问题。链接脚本 link.lds 将内核镜像放置在0x80200000起始的 16MB 区域。4.5 编译 RT-Thread Smart 版本如需编译 RT-Thread Smart微内核 用户态版本通过菜单配置使能两个选项RT-Thread Kernel - Enable RT-Thread Smart (microkernel on kernel/userland);Ultrarisc DP1000 Soc Drivers Configuration - Using MMC使能 SPI MMC 驱动用于挂载 TF 卡。执行scons --menuconfig保存配置后重新执行scons即可。Smart 模式相关的板级配置在 Kconfig 中通过BOARD_UR_DP1000自动选择ARCH_MM_MMU、ARCH_USING_ASID、ARCH_RISCV_FPU_D等特性并仅在RT_USING_SMART使能时开启ARCH_REMAP_KERNEL内核地址重映射。Using MMC选项在 board/Kconfig 中定义它会自动选中BSP_USING_SPI、RT_USING_SPI_MSD与RT_USING_DFS_ELMFAT即 SPI 主机 SPI 存储卡设备 elm-FAT 文件系统三者的组合。应用中 mnt.c 通过msd_init(sd0, spi00)注册 SPI TF 卡块设备随后依次尝试以 ext 与 elmFAT文件系统挂载到根目录/成功即打印Mount /dev/sd0p1 on /。5. 运行编译完成后可通过 JTAG 在 UR-DP1000 EVB 板卡上加载镜像运行。调试阶段为快速下载 RT-Thread 镜像、方便功能调试推荐使用 JTAG 下载与调试板卡上电后首先运行固化在 Flash 里的固件OpenSBI 启动将 JTAG 调试器与板卡 JTAG 接口连接同时启动 OpenOCD加载镜像标准版本直接通过 GDB 加载rt-thread.elf然后continue运行RT-Thread Smart 版本通过 GDB 加载rtthread.bin然后修改 PC 值为0x80200000后continue运行。# gdb restore rtthread.bin binary 0x80200000 set $pc0x80200000 continue这里0x80200000正是链接脚本 link.lds 中规定的内核加载地址0x80000000-0x80200000为 SBI 固件区0x80200000-0x81200000为内核区_start为入口符号。标准版携带 ELF 段信息可直接由 GDB 解析加载Smart 版则需以裸二进制方式restore到固定地址并手动设定 PC。成功运行时串口端输出如下已保留关键信息OpenSBI v1.6-66-gbeb27559acd Platform Name : ultrarisc,dp1000 Platform Features : medeleg Platform HART Count : 8 Platform IPI Device : aclint-mswi Platform Timer Device : aclint-mtimer 10000000Hz Platform Console Device : uart8250 Firmware Base : 0x80000000 Runtime SBI Version : 2.0 Standard SBI Extensions : time,rfnc,ipi,base,hsm,pmu,dbcn,legacy Experimental SBI Extensions : fwft,sse Domain0 Name : root Domain0 Boot HART : 0 Domain0 HARTs : 0*,1*,2*,3*,16*,17*,18*,19* Domain0 Next Address : 0x0000000080200000 Domain0 Next Mode : S-mode Boot HART ID : 0 Boot HART Base ISA : rv64imafdchx Boot HART ISA Extensions : zicntr,zihpm Boot HART PMP Count : 4 Test payload running ssi_version_id4.03* fifo length is 64 heap: [0x002acb28 - 0x042acb28] \ | / - RT - Thread Smart Operating System / | \ 5.2.1 build May 28 2025 08:24:41 2006 - 2024 Copyright by RT-Thread team [I/drivers.serial] Using /dev/ttyS0 as default console Mount /dev/sd0p1 on / Hello RT-Thread msh / / #这段输出可以按阶段解读OpenSBI 阶段固件版本 v1.6平台名ultrarisc,dp10008 个 HART编号 0-3 与 16-19定时器为 10MHz 的 aclint-mtimer控制台为 uart8250根域Domain0将下一级执行地址指向0x80200000以 S-mode 跳转印证了第 5 节中 Smart 镜像加载地址的设置依据RT-Thread 阶段内核版本 5.2.1控制台注册为/dev/ttyS0随后挂载 TF 卡分区到根目录对应 mnt.c 的INIT_ENV_EXPORT初始化流程Hello RT-Thread来自应用入口 main.c最终进入msh标准 shell与/Smart 用户态 shell双提示符交互界面。6. 板级初始化与内存布局源码视角板级初始化入口为 board.c 中的rt_hw_board_init()其执行顺序为Smart 模式初始化 MMU 映射与页分配器建立内核地址空间rt_hw_mmu_map_init→rt_page_init→rt_hw_mmu_setup初始化堆内存rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END)设置 PLIC 基地址并初始化中断控制器初始化系统 tickCLINT 定时器初始化 UART 并设置控制台设备调用rt_components_board_init()执行板级组件自动初始化。堆与页区间的定义在 board.hRT_HW_HEAP_BEGIN __bss_endBSS 段结束处即堆起点RT_HW_HEAP_END RT_HW_HEAP_BEGIN 64MBRT_HW_PAGE_START RT_HW_HEAP_ENDRT_HW_PAGE_END对应内核区末尾256MB 减去 2MB SBI 保留区供 Smart 模式页分配器使用。此外board.c 实现了rt_hw_cpu_reset()通过 SBIsbi_shutdown()复位机器并以MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine)导出为 msh 命令reboot在命令行直接输入reboot即可复位开发板。7. 配置菜单与定制要点Ultrarisc DP1000 Soc Drivers Configuration菜单board/Kconfig提供了以下可调项菜单项默认值说明Using PLICy使能中断控制器可调PLIC_BASE_ADDR默认0x9000000与PLIC_NDEV默认 160Using UART0y使能调试串口可调 IRQ18、参考时钟62500000、波特率115200、基地址0x20310000、寄存器移位2Using Dw apb ssi SPIn使能 Designware APB SSI SPI可调 IRQ19、基地址0x20320000、最大频率62500000Using MMCn使能 SPI TF 卡自动选中 SPI、SPI_MSD、elm-FATSmart 版运行 TF 卡根文件系统需要开启需要说明的是默认 rtconfig.h 中RT_CPUS_NR为 1即当前 BSP 默认以单核方式运行 RT-ThreadUR-CP100 的 8 核并行能力与核间中断依赖 CLINT 的 IPI可在此基础上进一步扩展。8. 联系人信息本 BSP 相关技术支持与问题反馈可联系超睿科技zhangjingultrarisc.com。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread 在 GD32VF103V_EVALRISC-V 内核上的 BSP 移植与实践指南RT Thread 在 GD32VF103V_EVALRISC V 内核上的 BSP 移植与实践指南 本指南围绕 RT Thread 仓库中 bsp/gd3操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在先楫 HPM6P00EVKRISC-V 双核上的 BSP 移植与快速上手实战指南RT Thread 在先楫 HPM6P00EVKRISC V 双核上的 BSP 移植与快速上手实战指南 本篇技术指南以 RT Thread 仓库中 bsp/操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 HPMicro RISC-V 开发板上的 BSP 移植与快速上手指南RT Thread 在 HPMicro RISC V 开发板上的 BSP 移植与快速上手指南 导读 本文基于 RT Thread 仓库中的 bsp/hpmicr操作系统嵌入式物联网嵌入式OSRTOS上一篇up/up错误处理完全手册自定义错误页面与监控告警下一篇TortoiseGit完全指南Windows下最酷的Git版本控制工具让代码管理事半功倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表