
操作系统嵌入式物联网嵌入式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 仓库中bsp/xuantie/xiaohui/r908BSP 为核心系统介绍玄铁 R908 这款面向高实时、高可靠场景的 64 位 RISC-V 处理器内核的架构特性以及如何基于该 BSP 完成编译、QEMU 仿真运行、SMP 多核使能与调试的全流程。读完本文你将掌握 R908 系列 BSP 的内核切换方法、menuconfig配置要点、QEMU 启动命令与调试手段并理解其底层板级初始化与多核启动的源码实现。一、R908 内核概述面向高可靠高实时的 64 位 RISC-V 处理器R908 是玄铁XuanTieR 系列产品的新成员是一款兼容 RISC-V 架构的 64 位处理器专门面向高端工控、存储控制、通信计算、车载等对实时性和可靠性要求极高的领域设计。相比前代产品它在架构上做了全面的更新与升级对实时性与可靠性进行了整体提升。1.1 同构多核架构R908 采用同构多核架构支持多个 cluster每个 cluster 可配置 1~4 个核心。每个 R908 核心均采用自主设计的微体系结构重点针对性能进行优化具体包括按序双发射按序取指、发射、执行和退休配合 9 级流水架构多模式分支预测支持 2KB/4KB/8KB 的多算法分支预测器以及循环终止预测多通道数据预取支持 8 通道数据预取既能处理固定 stride也能处理规律性不定 stride 的数据流。此外R908 核心支持实时检测并关断内部空闲功能模块从而降低处理器动态功耗这一点对实时嵌入式场景中的功耗控制尤为关键。1.2 核心特性一览以下特性摘自 BSP 文档可作为 R908 微体系结构的速查表类别特性指令集RISC-V 64GCB[V] 指令架构User Mode 同时支持 RV64 与 RV32 指令集支持小端模式流水线9 级流水按序双发射取指、发射、执行、退休均按序内存管理两级 TLB 内存管理单元实现虚实地址转换与内存管理缓存指令缓存与数据缓存大小可配置16KB/32KB/64KB缓存行 64B指令缓存可配置奇偶校验数据缓存可配置 ECC 或奇偶校验取指优化指令预取功能由硬件自动检测并动态启动指令缓存路预测的低功耗访问技术分支预测2KB/4KB/8KB 多算法分支预测器256 表项分支目标缓存器BTB8 层硬件返回地址堆栈256 表项间接跳转分支预测器循环终止预测执行优化指令融合技术双发射按序执行 Load/Store 指令支持写合并总线访问读、写内存分别支持 8 路、12 路并发的总线访问数据预取8 通道数据预取支持固定 stride 与规律性不定 stride从这些特性可以看出R908 在实时性按序、可预测的流水线行为与可靠性ECC/奇偶校验、多级 TLB两个维度上做了针对性设计契合其高端工控、车载等目标场景。二、BSP 支持的内核变体与默认配置2.1 支持的内核列表当前bsp/xuantie/xiaohui/r908BSP 支持以下内核变体r908 r908-cp r908fd r908fd-cp r908fdv r908fdv-cp其中后缀cp表示带 Cache 校验奇偶校验/ECC能力的配置后缀f、d、v分别对应 RISC-V 的 F单精度浮点、D双精度浮点、V向量扩展后缀组合如fdv表示同时启用多项扩展。2.2 默认内核与 FPU/Vector 使能该 BSP 默认设置的内核为r908fdv即同时支持 F、D、V 扩展。在rtconfig.h中可以看到对应的默认开关#define XUANTIAN_XIAOHUI_R908 /* CPU Architecture Features */ #define ENABLE_FPU #define ENABLE_VECTOR这些宏由 bsp/xuantie/xiaohui/r908/Kconfig 中的menuconfig选项控制ENABLE_FPU默认开启并联动ARCH_RISCV_FPU、ARCH_RISCV_FPU_DENABLE_VECTOR默认开启并自动依赖ENABLE_FPUmenuconfig ENABLE_FPU bool Enable FPU select ARCH_RISCV_FPU select ARCH_RISCV_FPU_D default y menuconfig ENABLE_VECTOR bool Enable VECTOR select ARCH_RISCV_VECTOR select ENABLE_FPU default y因此如果不需要浮点或向量能力可以在scons --menuconfig中关闭对应选项从而生成更适合裸核或轻量级场景的配置。对应地rtconfig.h中还会生成ARCH_RISCV64、ARCH_RISCV_FPU、ARCH_RISCV_VECTOR、ARCH_VECTOR_VLEN_128、ARCH_USING_NEW_CTX_SWITCH等架构级宏供内核与 libcpu 移植层使用。2.3 切换内核修改 MCPU 字段当需要使用其他内核架构例如r908fd或r908时需要修改 rtconfig.py 中的MCPU字段同时保持MCPU_DEFINE与之一致MCPU -mcpur908fdv # Modify here based on CPU architecture. MCPU_DEFINE -DCONFIG_CPU_XUANTIE_R908FDV1 # Modify here based on CPU architecture. DEVICE MCPU MCPU_DEFINE -Wno-main -mcmodelmedany -MP -MMD 需要同步注意两点编译选项中使用了-mcmodelmedany适配 RISC-V 的 medium-any 代码模型链接时可寻址全地址空间MCPU_DEFINE定义CONFIG_CPU_XUANTIE_R908FDV1该宏会被玄铁 CSI 库与 libcpu 移植层用来选择对应的启动代码与中断向量实现。在 bsp/xuantie/libraries/xuantie_libraries/chip_riscv_dummy/src/arch 目录下可以看到 r908 对应的启动汇编与初始化实现r908/子目录与 c906、c907、e906、e907 等变体并列证实了该 BSP 的 libcpu/启动代码按内核型号分别组织。三、开发工具链与运行环境3.1 工具链构成开发 R908 BSP 需要三样东西编译器基于 RISC-V 的 GNU 交叉编译工具链riscv64-unknown-elf-前缀见下模拟器支持-machine xiaohui的 QEMUqemu-system-riscv64SDK玄铁 CDK 中自带的编译器与模拟器可作为备选。这些工具均可在玄铁官方工具链下载渠道获取若官方链接中的编译器与模拟器不可用可以使用 CDK玄铁嵌入式集成开发环境中附带的版本。仓库本身不包含闭源编译器编译前需要自行准备。3.2 工具链路径配置rtconfig.py中默认将交叉工具链路径指向 RT-Thread Studio 解压出的玄铁 GCC 工具链if CROSS_TOOL gcc: PLATFORM gcc EXEC_PATH rD:\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\RISC-V\XTGccElfNewlib\V3.0.1\R\bin工具链前缀为riscv64-unknown-elf-对应gcc、g、ar、objdump、objcopy、size等组件。如果工具链不在默认路径可以通过环境变量覆盖if os.getenv(RTT_EXEC_PATH): EXEC_PATH os.getenv(RTT_EXEC_PATH)即设置RTT_EXEC_PATH指向实际 bin 目录即可无需改动脚本。链接脚本默认使用 gcc_flash_xiaohui.ld若 BSP 根目录存在本地libraries副本则优先使用本地版本。四、编译与 QEMU 仿真运行4.1 编译生成可执行文件搭建好 RT-Thread 开发环境推荐使用 env 工具后在 BSP 根目录bsp/xuantie/xiaohui/r908执行scons --menuconfig # 可选按需更新配置 scons -j12 # 编译生成 rtthread.elf / rtthread.bin编译流程由 SConstruct 驱动它导入rtconfig.py通过PrepareBuilding准备 RT-Thread 内核构建环境随后递归编译 bsp/xuantie/libraries 下的玄铁库SConscript会按目录递归收集子工程最终生成rtthread.elf。POST_ACTION会执行objcopy -O binary生成rtthread.bin并输出size信息。默认构建为 debug 模式-O0 -g3便于断点调试如需发布版可注释掉BUILD debug并启用BUILD release对应-O2 -g2。4.2 使用 QEMU 启动BSP 根目录提供了qemu.bat脚本Windows生成可执行文件后可直接双击启动 QEMU。该脚本支持交互式配置从qemu_config.txt读取 QEMU 安装目录默认E:\XuanTieCore\6.QEMU启动时可重新输入从cpu_config.txt读取-cpu参数默认r908fdv启动时可重新输入校验qemu-system-riscv64.exe与rtthread.elf是否存在后执行!QEMU_PATH! -machine xiaohui -kernel !ELF_PATH! -nographic -cpu !CPU_PARAM!Linux 用户可以直接使用qemu-system-riscv64命令启动qemu-system-riscv64 -machine xiaohui -smp cpus2 -nographic -kernel rtthread.elf -cpu r908fdv各参数含义参数说明-machine xiaohui选择玄铁小灰XiaoHuiFPGA/仿真平台机器模型-smp cpus2以 2 核 SMP 模式启动配合内核 SMP 配置-nographic无图形界面串口/控制台直接映射到终端-kernel rtthread.elf指定内核镜像-cpu r908fdv选择带 F/D/V 扩展的 R908 CPU 模型需与编译时MCPU一致启动后应能在终端看到 RT-Thread 启动日志与 MSH 命令行提示符默认控制台设备为uart0见rtconfig.h中RT_CONSOLE_DEVICE_NAME uart0。五、SMP 多核支持配置与启动实现5.1 配置 SMPR908 是支持多 cluster、每 cluster 1~4 核的同构多核处理器该 BSP 完整支持 RT-Thread 的 SMP 能力。需要 SMP 时在 BSP 根目录执行scons --menuconfig使能 SMP 功能并配置 CPU 个数。配置结果会写入 rtconfig.h 的RT_CPUS_NR宏默认单核#define RT_CPUS_NR 1。rtconfig.py会自动检测该宏并追加对应编译选项if read_rtconfig_macro(RT_USING_SMP): GLOBAL_DEFINES -DCONFIG_SMP1 GLOBAL_DEFINES -DCONFIG_NR_CPUSRT_CPUS_NR 即只要rtconfig.h中定义了RT_USING_SMP编译时就会自动带上-DCONFIG_SMP1与-DCONFIG_NR_CPUS核数。5.2 从核启动与 CSR 同步SMP 的关键在于从核secondary core的启动。该实现位于 board/board.c 的riscv_soc_start_cpu()void riscv_soc_start_cpu(int cpu_num) { if (cpu_num 1) { return; } c9xx_csr_copy(); *(unsigned long *)((unsigned long)XIAOHUI_SRESET_BASE XIAOHUI_SRESET_ADDR_OFFSET ((cpu_num - 1) 3)) (unsigned long)Reset_Handler; #if __riscv_xtheadsync __ASM(sync); #endif /* Release secondary cpus, Determined by the xiaohui FPGA platform */ *(uint32_t *)(XIAOHUI_SRESET_BASE) 0x7f; }其流程为通过c9xx_csr_copy()将启动核primary core的 CSR 值同步给从核——包括PMPADDR0~7、PMPCFG0、MCOR、MHCR、MCCR2、MHINT、MTVEC、MIE、MXSTATUS以及 PLIC/CLINT 基址CSR_MAPBADDR读取保证从核与主核具备一致的访存保护与中断/定时器视图将每个从核的入口地址Reset_Handler写入平台定义的软件复位寄存器区XIAOHUI_SRESET_BASE 0x18030000偏移0x10每个核 8 字节向0x18030000写入0x7f释放全部从核并通过玄铁扩展指令sync__riscv_xtheadsync保证写入顺序可见。rt_hw_board_init()则完成中断初始化、堆初始化__heap_start/__heap_end由链接脚本提供、UART 初始化与控制台绑定以及rt_components_board_init()组件初始化。5.3 SMP 示例程序入口程序 applications/main.c 在RT_USING_SMP使能时会额外调用smp_example()实现位于 bsp/xuantie/libraries/xuantie_libraries/smp_demo.c用于验证多核调度运行可配合-smp cpus2直接观察双核输出int main(void) { rt_kprintf(Hello RT-Thread!\r\n); #ifdef RT_USING_SMP extern void smp_example(void); smp_example(); #endif return 0; }六、调试方法env 工具与 VS Code 联合调试搭建完成 RT-Thread 开发环境后在 BSP 根目录使用 env 工具打开当前目录的命令行首次使用时务必先执行一次menuconfig命令以更新rtconfig.h配置然后执行scons -j12编译生成可执行文件说明原 BSP 文档以 E906 的调试方法举例R908 的操作方式完全一致。menuconfig会同步更新rtconfig.h而rtconfig.py中的 SMP 宏检测逻辑正是读取该文件因此先 menuconfig 再编译的顺序对 SMP 等配置项生效至关重要。编译成功后即可使用 VS Code 进行调试如配置 launch.json 调用 GDB 连接 QEMU 或仿真器BSP 还附带了 GDB 初始化脚本 utilities/gdb.init用于在仿真环境下先布置入口跳转再复位set *(int *)0x00x6f si reset set *(int *)0x400110080x0 set *(int *)0x4001101c0x0调试时若需要反汇编产物可配合根目录的objdump.bat脚本使用。七、BSP 目录结构与源码导读bsp/xuantie/xiaohui/r908目录结构如下bsp/xuantie/xiaohui/r908/ ├── applications/ # 应用入口main.c、SConscript ├── board/ # 板级初始化board.c/board.h、Kconfig ├── figures/ # 文档配图 ├── utilities/ # gdb.init 调试脚本 ├── Kconfig # BSP 级菜单配置内核、FPU/Vector ├── SConstruct / SConscript ├── qemu.bat / objdump.bat # QEMU 启动与反汇编脚本 ├── rtconfig.h # 配置结果编译前由 menuconfig 更新 ├── rtconfig.py # 编译脚本工具链、MCPU、链接脚本等 ├── rtconfig_preinc.h # 预包含头文件 └── template.cdkproj / template.cdkws # CDK 工程模板硬件抽象与玄铁库位于 bsp/xuantie/libraries关键子模块xuantie_libraries/chip_riscv_dummy/芯片虚拟平台描述含gcc_flash_xiaohui.ld链接脚本、arch/r908启动与时钟初始化代码、drivers中断控制器 PLIC、CLINT、定时器、UART 等底层驱动、sys系统初始化xuantie_libraries/csi/csi2/玄铁 CSI v2 驱动框架头文件xuantie_libraries/lib_cpu/RT-Thread libcpu 移植层包括cpuport.c、cpuport_smp.c、context_gcc.S、interrupt_gcc.S、atomic_riscv.c、clint.c、stackframe.h等是上下文切换与中断入口的核心device_drivers/drv_usart.c串口驱动对接RT_USING_SERIALpre_main/pre_main.c提供main之前的环境准备。板级外设能力在 board/board.h 中通过CONFIG_BOARD_XXX宏声明UART 1 路、GPIO/PWM/ADC/按键/LED 等UART0 默认波特率 115200控制台缓冲 128 字节该 BSP 默认仅使能 UART0BSP_USING_UART0如需扩展外设可从 board/Kconfig 中打开。八、关键配置速查配置项位置默认值 / 说明内核型号MCPUrtconfig.py L46-mcpur908fdv切换内核时需同步修改MCPU_DEFINEFPU / VectorKconfigENABLE_FPU、ENABLE_VECTOR均默认开启CPU 核数rtconfig.hRT_CPUS_NR 1默认单核SMP 下改大系统节拍rtconfig.hRT_TICK_PER_SECOND 1000主线程栈rtconfig.hRT_MAIN_THREAD_STACK_SIZE 4096控制台设备rtconfig.hRT_CONSOLE_DEVICE_NAME uart0缓冲 512BUART0board/KconfigBSP_USING_UART/BSP_USING_UART0波特率 115200链接脚本rtconfig.py L27gcc_flash_xiaohui.ldQEMU 启动qemu.bat/ 命令行-machine xiaohui -cpu r908fdvSMP 加-smp cpus2结语从本文可以看到RT-Thread 对玄铁 R908 的支持是完整且可落地的BSP 覆盖了从r908到r908fdv-cp的多个内核变体menuconfig可灵活开关 FPU/Vectorrtconfig.py可无缝切换工具链与内核型号QEMU 的xiaohui机器模型让开发者无需硬件即可验证多核 SMP 行为而board.c中的 CSR 同步与软件复位机制则揭示了从核启动的底层原理。对于希望在高端工控、车载等高可靠场景中使用玄铁 R908 RT-Thread 的开发者这个 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 在玄铁 C907 上的落地实践BSP 架构、SMP 多核使能与 QEMU 调试指南RT Thread 在玄铁 C907 上的落地实践BSP 架构、SMP 多核使能与 QEMU 调试指南 RT Thread 官方 BSP 为平头哥玄铁Xua操作系统嵌入式物联网嵌入式OSRTOSRT-Thread Smart 在玄铁 C908 多核处理器上的移植实践xiaohui BSP 解析与 QEMU 调试指南RT Thread Smart 在玄铁 C908 多核处理器上的移植实践xiaohui BSP 解析与 QEMU 调试指南 本文以 RT Thread 仓库中操作系统嵌入式物联网嵌入式OSRTOSOpenMed HL7 v2去标识化指南分段与字段级脱敏实战详解OpenMed HL7 v2去标识化指南分段与字段级脱敏实战详解 OpenMed 是一个本地优先的医疗 AI 工具提供临床实体识别与 HIPAA PII个操作系统嵌入式物联网嵌入式OSRTOS上一篇为什么Fontello是前端开发者的图标神器5大核心优势深度剖析下一篇性能提升200%的秘密Laravel-MongoDB复合索引与单字段索引实战对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考