十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

在 QEMU MIPSSIM 模拟器中运行 RT-Thread:MIPS 架构 BSP 快速上手与串口驱动源码剖析

在 QEMU MIPSSIM 模拟器中运行 RT-Thread:MIPS 架构 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点击查看免费下载本指南以 bsp/mipssim/README.md 为核心系统讲解 RT-Thread 的 MIPSSIM 板级支持包BSP——一个面向 QEMU MIPSSIM Machine 模拟器的 MIPS 架构移植。通过本指南你将掌握如何使用 mips-sde-elf 交叉工具链编译该 BSP、在 QEMU 中一条命令启动 RT-Thread 内核并深入理解其板级初始化、CP0 定时器、8250 兼容串口驱动的源码实现为后续在模拟器上进行 MIPS 架构开发与调试打下基础。1. MIPSSIM BSP 简介根据 bsp/mipssim/README.mdMIPSSIM BSP 用于在MIPSSIM 或 QEMU 的 MIPSSIM Machine 模拟器中运行 RT-Thread使用mips-sde-elf工具链编译。模拟器提供两类外设8250 串口UART用于内核控制台console输出与输入MIPSNET 网卡网络外设目前该 BSP仅实现了串口网卡尚未适配。从 rtconfig.h 底部可以看到#define MIPSSIM宏它正是该 BSP 的专属标识驱动代码通过该宏与架构宏ARCH_MIPS协同工作。在 Kconfig 中config MIPSSIM会强制select ARCH_MIPS、RT_USING_COMPONENTS_INIT、RT_USING_USER_MAIN与RT_USING_DEVICE保证内核在模拟器上按组件自动初始化流程启动。1.1 仓库结构一览bsp/mipssim/ ├── applications/ # 应用层main.c 入口 ├── drivers/ # 板级驱动board.c、drv_uart.c、interrupt.c 等 ├── Kconfig # 配置菜单 ├── SConscript / SConstruct# scons 构建脚本 ├── mipssim_ram.lds # MIPS 链接脚本RAM 运行 ├── rtconfig.h # 内核与组件配置 └── rtconfig.py # 工具链与编译选项2. 交叉编译工具链配置该 BSP 必须使用 MIPS 小端little-endian交叉工具链编译工具链选择集中在 rtconfig.py 中。# CPU options ARCHmips CPU common PREFIX mips-sde-elf- CC PREFIX gcc AS PREFIX gcc AR PREFIX ar LINK PREFIX gcc TARGET_EXT elf2.1 工具链路径工具链默认路径为/opt/mips-2016.05/bin即MIPS SDESoftware Development Environment工具链其前缀即为mips-sde-elf-EXEC_PATH /opt/mips-2016.05/bin如果工具链安装在其他位置可通过环境变量覆盖无需修改文件export RTT_EXEC_PATH/your/toolchain/bin export RTT_CCgcc2.2 关键编译选项DEVICE -mips32r2 -msoft-float -mfp32 CFLAGS DEVICE -EL -G0 -mno-abicalls -fno-pic -fno-builtin \ -fno-exceptions -ffunction-sections -fomit-frame-pointer AFLAGS -c DEVICE -EL -fno-pic -fno-builtin -mno-abicalls -x assembler-with-cpp LFLAGS DEVICE -nostartfiles -EL -Wl,--gc-sections,-Maprtthread.map,-cref,-u,Reset_Handler -T mipssim_ram.lds各选项含义选项作用-mips32r2指定 MIPS32 Release 2 指令集架构-msoft-float/-mfp32使用软件浮点、32 位浮点寄存器模拟器上避免硬浮点依赖-EL生成小端little-endian代码与qemu-system-mipsel匹配-G0不使用全局指针GP优化小数据段-mno-abicalls/-fno-pic关闭 PIC/abicalls适配裸机链接-ffunction-sections--gc-sections允许链接器回收未使用函数减小镜像-nostartfiles不使用标准启动文件由 BSP 自带cpuinit_gcc.S提供入口-T mipssim_ram.lds指定 mipssim_ram.lds 链接脚本-u,Reset_Handler强制引入复位处理符号debug 模式下追加-O0 -gdwarf-2release 模式使用-O2。此外 SConstruct 会根据RT_USING_FPU自动把-msoft-float替换为-mhard-float——从当前 rtconfig.h 看该 BSP 默认未开启 FPU。3. 编译生成 rtthread.elf进入 BSP 目录后使用 scons 构建scons 需要提前安装RT-Thread 的构建体系位于 tools 目录由 SConstruct 引入cd bsp/mipssim scons构建产物说明见 rtconfig.py 末尾的 POST_ACTIONrtthread.elfELF 可执行文件供 QEMU 直接加载rtthread.bin由objcopy -O binary生成的裸二进制镜像rtthread.map链接映射文件rtt.asm、rtt.map反汇编与符号表导出通过 OBJDUMP / READELF 生成。注意rtthread.map与rtt.map均为构建期生成物不要在源码中查找它们。4. 在 QEMU 中运行 RT-ThreadREADME 给出了官方启动命令qemu-system-mipsel -M mipssim -cpu P5600 -nographic -kernel ./rtthread.elf各参数含义参数说明qemu-system-mipselMIPS 小端模拟器可执行文件-M mipssim选择 MIPSSIM Machine 板型-cpu P5600指定 CPU 模型为 MIPS P5600MIPS32r2 兼容-nographic禁用图形窗口将串口重定向到终端-kernel ./rtthread.elf加载内核镜像启动后即可在终端看到 RT-Thread 的启动 banner由于 rtconfig.h 中启用了 MSHRT_USING_MSH/FINSH_USING_MSH随后会进入 finsh/msh 交互 shell可通过串口执行help、version等命令。5. 内存布局链接脚本 mipssim_ram.ldsbsp/mipssim/mipssim_ram.lds 定义了镜像在模拟器内存中的排布关键点入口与基址ENTRY(_start)代码段从虚拟地址0x80000000KSEG0开始异常向量KEEP(*(.exc_vectors))位于__ebase_entry用于 MIPS 异常入口finsh 符号表__fsymtab_start/__fsymtab_endFSymTab、__vsymtab_start/__vsymtab_endVSymTab供 MSH 命令自动注册自动初始化段__rt_init_start/__rt_init_endKEEP(*(SORT(.rti_fn*)))承载组件初始化函数utest 用例表UtestTcTab与 rtconfig.h 中RT_USING_UTEST对应堆栈段.stack段保留 0x10004KB系统栈_system_stack标记栈顶BSS__bss_start/__bss_end其中__bss_end被 board.c 引用为系统堆起点。6. 板级初始化board.c 启动流程bsp/mipssim/drivers/board.c 是 BSP 的核心初始化入口rt_hw_board_init()依次完成异常与中断初始化rt_hw_exception_init()rt_hw_interrupt_init()FPU 初始化#ifdef RT_USING_FPU下调用rt_hw_fpu_init()串口初始化rt_hw_uart_init()后调用rt_console_set_device(uart)与 rtconfig.h 中RT_CONSOLE_DEVICE_NAME uart完全对应系统堆初始化rt_system_heap_init((void*)__bss_end, (void*)RT_HW_HEAP_END)——堆从 BSS 结束处延伸到0x80000000 64MB系统定时器初始化rt_hw_timer_init()组件板级初始化rt_components_board_init()打印Current SR: 0x...状态寄存器信息。6.1 CP0 定时器系统 Tick 的来源MIPSSIM 没有外部定时器外设系统时钟直接使用 MIPS 架构自带的CP0 Count/Compare寄存器void rt_hw_timer_init(void) { write_c0_compare(CPU_HZ/2/RT_TICK_PER_SECOND); write_c0_count(0); mips_unmask_cpu_irq(7); } void rt_hw_timer_handler(void) { unsigned int count; count read_c0_compare(); write_c0_compare(count); /* 重新装载 Compare */ write_c0_count(0); /* 清零 Count避免溢出 */ rt_tick_increase(); /* 递增 OS Tick */ }其中CPU_HZ定义为 100MHzRT_TICK_PER_SECOND为 100见 rtconfig.h因此 Compare 值 100M / 2 / 100 500000即每 5ms 产生一次定时中断驱动一次系统 Tick对应内核宏RT_TICK_PER_SECOND 100。7. 串口驱动8250 兼容 UART 的实现剖析7.1 寄存器基址映射MIPSSIM 的 ISA 外设 MMIO 基址为0x1fd00000见 bsp/mipssim/drivers/mipssim.h#define ISA_MMIO_BASE 0x1fd00000 #define UART0_ISA_OFF 0x3f8 #define UART0_BASE KSEG1ADDR(ISA_MMIO_BASE UART0_ISA_OFF)0x3f8正是标准 PC 8250/16550 UART 的 COM1 端口地址KSEG1ADDR将物理地址映射到 KSEG1 未缓存区0xa0000000起确保模拟器上的 MMIO 读写不被缓存干扰。UART 的 8 个寄存器位偏移定义在 bsp/mipssim/drivers/drv_uart.h 中UART_DAT(0x00)、UART_IER(0x01)、UART_IIR/FCR(0x02)、UART_LCR(0x03)、UART_MCR(0x04)、UART_LSR(0x05)、UART_MSR(0x06)与 16550 标准寄存器布局一致。7.2 驱动框架实现bsp/mipssim/drivers/drv_uart.c 通过 RT-Thread 串口框架rt_serial_devicert_uart_ops实现mipssim_uart_ops包含四个回调configureUART_IER 0关闭中断 →UART_FCR 0xc1复位并启用 FIFO →UART_LCR 0x38 数据位、1 停止位、无校验→ 设置 MCR/LSR/MSR 初值control处理RT_DEVICE_CTRL_CLR_INT/RT_DEVICE_CTRL_SET_INT通过rt_hw_interrupt_mask/umask打开或关闭 RX 中断并使能IER_IRxE | IER_ILEputc轮询UART_LSR的UARTLSR_TE | UARTLSR_TFE发送空标志然后写UART_DATgetc检查LSR_RXRDY接收就绪后读取UART_DAT无数据返回 -1。设备注册时使用了中断 RX 标志并挂接 IRQ 4rt_hw_interrupt_install(uart-IRQ, uart_irq_handler, serial, UART); rt_hw_serial_register(serial, uart, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);中断处理函数uart_irq_handler根据 IIR 判断中断原因若是接收数据或接收超时IIR_RXTOUT/IIR_RXRDY则进入中断上下文并调用rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND)触发内核串口接收回调。该驱动使用 RT-Thread 串口框架的V1 版本RT_USING_SERIAL_V1见 rtconfig.h默认波特率等参数取自RT_SERIAL_CONFIG_DEFAULT宏位于 components/drivers 的串口框架源码中。8. 内核与组件配置rtconfig.h 关键选项bsp/mipssim/rtconfig.h 由 menuconfig 生成与 Kconfig引用libcpu/mips/common/Kconfig联动。核心选项如下内核基础RT_NAME_MAX 12、RT_CPUS_NR 1单核、RT_THREAD_PRIORITY_MAX 32、RT_TICK_PER_SECOND 100、软件定时器线程RT_USING_TIMER_SOFT优先级 4、栈 2048。内存管理启用RT_USING_SMALL_MEM_AS_HEAP小内存管理算法作为默认堆。控制台与串口RT_USING_CONSOLE、RT_CONSOLEBUF_SIZE 512、RT_CONSOLE_DEVICE_NAME uart与 board.c 的rt_console_set_device(uart)一一对应RT_USING_SERIALRT_USING_SERIAL_V1。ShellRT_USING_MSHFINSH_USING_MSHfinsh 线程tshell优先级 20、栈 4096启用历史记录5 行、符号表FINSH_USING_SYMTAB、参数补全FINSH_USING_OPTION_COMPLETION。IPC 与 POSIX信号量/互斥量/事件/邮箱/消息队列全部开启POSIX 层启用延迟、时钟、pthreadsPTHREAD_NUM_MAX 8。调试RT_USING_DEBUG、断言、彩色打印、上下文检查。9. 应用入口与后续扩展bsp/mipssim/applications/main.c 提供了main()空实现作为用户应用入口内核启用RT_USING_USER_MAIN后自动创建 main 线程优先级 10、栈 2048。读者可在此添加自己的应用逻辑例如int main(int argc, char** argv) { rt_kprintf(Hello RT-Thread on MIPSSIM!\n); return 0; }9.1 待实现方向MIPSNET 网卡README 明确说明模拟器还提供 MIPSNET 网卡外设但当前 BSP 仅移植了串口。若需支持网络可从以下方向入手需结合 libcpu/mips 的中断与总线抽象参照 components/drivers 中的网络设备驱动框架实现 MIPSNET 的驱动在 Kconfig 中补充网络组件与驱动相关配置启用 rtconfig.h 中当前为空的 Network 配置区引入 lwIP 协议栈。10. 常见问题排查找不到mips-sde-elf-gcc说明工具链未安装或不在PATH/EXEC_PATH中请安装 MIPS SDE 工具链或通过RTT_EXEC_PATH环境变量指定路径见 rtconfig.py。QEMU 启动后无输出确认使用小端模拟器qemu-system-mipsel且带-nographic参数同时确保-kernel指向编译生成的rtthread.elf。链接报错undefined reference to Reset_Handler检查是否使用了 rtconfig.py 中-u,Reset_Handler对应的复位入口该符号由 bsp/mipssim/drivers/cpuinit_gcc.S 提供。修改配置后未生效配置由menuconfig写入 rtconfig.h修改后需重新运行scons全量构建。总结MIPSSIM BSP 是 RT-Thread 在 MIPS 架构上的精简而完整的移植范例通过 mips-sde-elf 工具链与 QEMU 模拟器开发者无需真实硬件即可体验 MIPS32 内核的启动、调度与串口交互其源码清晰地展示了板级初始化、CP0 定时器驱动、8250 串口驱动与 RT-Thread 设备框架的衔接方式。本文涉及的配置与驱动文件均位于 bsp/mipssim 目录可作为学习 MIPS 架构移植和进行模拟器开发的直接参考。赞分享操作系统嵌入式物联网嵌入式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点击查看免费下载相关推荐在 QEMU 上运行 RT-ThreadCore-V-MCUcv32e40pBSP 完整上手指南在 QEMU 上运行 RT ThreadCore V MCUcv32e40pBSP 完整上手指南 本文以 RT Thread 官方仓库中 bsp/core操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 HPM5301EVKLITE 上的 BSP 快速上手与源码级解析RT Thread 在 HPM5301EVKLITE 上的 BSP 快速上手与源码级解析 本指南以 RT Thread 开源仓库中的 bsp/hpmicro/h操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 HPMicro HPM6750EVK2 上的 BSP 快速上手与驱动配置指南RT Thread 在 HPMicro HPM6750EVK2 上的 BSP 快速上手与驱动配置指南 本篇技术指南以 RT Thread 仓库中的 HPM675操作系统嵌入式物联网嵌入式OSRTOS上一篇csvformat让你的CSV文件格式规范的简单工具下一篇Kami未来路线图即将推出的功能与改进方向预测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表