RT-Thread BSP 解析:NXP i.MX6 SoloX(i.MX6UL)SABRE 开发板的移植与构建

发布时间:2026/9/26 7:36:30
RT-Thread BSP 解析:NXP i.MX6 SoloX(i.MX6UL)SABRE 开发板的移植与构建 操作系统嵌入式物联网嵌入式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点击查看免费下载NXP i.MX6 SoloX 是面向智能设备推出的异构双核应用处理器RT-Thread 在bsp/nxp/imx/imx6ul目录下提供了完整的板级支持包BSP。本文以该 BSP 的官方 READMEbsp/nxp/imx/imx6ul/README.md为核心骨架结合仓库内真实的启动代码、驱动实现与构建脚本深入讲解该平台的硬件资源、BSP 目录结构、GCC 构建流程、MMU 内存映射、EPIT 定时器与 UART 驱动实现帮助读者掌握在 SABRE 开发板上运行 RT-Thread 的完整技术路径并为自行移植 Cortex-A 系列 BSP 提供可复用的范式。硬件平台概览SABRE 板与 i.MX6 SoloX 处理器根据官方 README 的描述本 BSP 面向 Freescale现 NXP的 Smart Application Blueprint for Rapid EngineeringSABRE智能设备开发板硬件版本为 Rev.B主控芯片型号为 MCIMX6X4EVM10AB即 i.MX6 SoloXi.MX6SX应用处理器。该平台的核心硬件资源如下硬件类别具体配置应用处理器APARM Cortex-A9主频 1 GHz实时处理器RPARM Cortex-M4主频 200 MHz电源管理Freescale PF0200 PMIC内存1 GB DDR3存储32 MB × 2 QuadSPI Flash传感器Freescale MMA8451 三轴加速度计、Freescale MAG3110 三维磁力计i.MX6 SoloX 的典型特征在于其异构双核架构Cortex-A9 应用核运行 Linux 或 RT-Thread 等具备 MMU 能力的大型操作系统Cortex-M4 实时核则承担对实时性要求苛刻的任务两核间通过共享内存等机制协作。本仓库的 RT-Thread BSP 运行于 Cortex-A 侧rtconfig.h中SOC_MCIMX6X4、ARCH_ARM、ARCH_ARM_MMU、ARCH_ARM_CORTEX_A等宏见 bsp/nxp/imx/imx6ul/rtconfig.h从侧面印证了这一点该移植基于带 MMU 的 Cortex-A 内核。值得注意的是rtconfig.h同时定义了ARCH_ARM_CORTEX_A7与RT_USING_GIC_V2GICv2 中断控制器而构建脚本rtconfig.py中使用了-mtunecortex-a9的编译调优参数因此从源码结构看该 BSP 的代码同时兼容/覆盖了 i.MX6UL/6ULL 系列 Cortex-A7 内核与 SoloX 的 Cortex-A9 内核读者在实际使用时应以自己板卡的 CPU 型号为准核对相关宏。BSP 目录结构一个 Cortex-A BSP 的标准布局bsp/nxp/imx/imx6ul遵循 RT-Thread BSP 的标准布局顶层文件与子目录分工明确applications/应用入口与启动代码包含application.c应用初始化与startup.cRT-Thread 启动流程drivers/板级驱动包括board.c定时器与板级初始化、board.h、serial.c/serial.hUART 串口驱动以及iomux/引脚复用配置Kconfig、SConscript、SConstructmenuconfig 配置入口与 scons 构建脚本Makefile备用构建入口link.ldsGCC 链接脚本定义代码段、只读数据段、初始化函数表、页表与 BSS 的布局rtconfig.h由 menuconfig 生成的最终内核配置rtconfig.pyGCC 工具链与编译参数定义README.md板级硬件说明本文的核心依据。在驱动层面drivers/imx6ul.h定义了本 BSP 的中断基础设施通过协处理器指令mrc p15, 4, ...读取 Cortex-A 的 CBAR 寄存器获得 GIC通用中断控制器基址再叠加kGICDBaseOffset/kGICCBaseOffset得到 Distributor 与 CPU Interface 基址drivers/imx6ul.h。ARM_GIC_MAX_NR、MAX_HANDLERS等宏则确定了 GIC 与中断向量表的容量供 RT-Thread 的中断管理框架使用。构建环境scons 构建流程与依赖包检查该 BSP 采用 scons 构建入口脚本为SConstructbsp/nxp/imx/imx6ul/SConstruct。其特殊之处在于构建前会执行一次依赖包检查bsp_pkg_check()会验证packages/nxp-imx6ul-sdk-latest目录是否存在如果缺失则提示先执行pkgs --update若从未拉取过包则先pkgs --upgrade再pkgs --update并直接退出构建。这意味着本 BSP 依赖 NXP 官方 SDK 封装包nxp-imx6ul-sdk-latest该依赖也在rtconfig.h中以PKG_USING_NXP_IMX6UL_DRIVER宏登记构建前必须先通过 RT-Thread 包管理器获取该 SDK。工具链配置集中在rtconfig.pybsp/nxp/imx/imx6ul/rtconfig.py仅支持 GNU GCC 工具链前缀为arm-none-eabi-交叉编译器由RTT_CC/RTT_EXEC_PATH环境变量覆盖默认路径为/usr/bin架构参数-marcharmv7-a -mtunecortex-a9 -mfpuvfpv3-d16 -ftree-vectorize -ffast-math -mfloat-abisoftfp即 ARMv7-A 架构、VFPv3-D16 浮点单元、软浮点 ABIdebug 构建使用-O0release 构建使用-O2均开启-gdwarf-2调试信息链接参数包含--gc-sections剔除未使用段、-Maprtthread.map输出符号映射表、-u,system_vectors强制引用系统向量表以及-T link.lds链接脚本构建完成后自动执行objcopy -O binary生成rtthread.bin烧写镜像并调用size输出各段体积统计。因此标准构建命令为在 BSP 目录下先执行pkgs --update拉取 SDK 依赖再执行scons生成rtthread.elf与rtthread.bin。内核配置要点从 rtconfig.h 看系统裁剪rtconfig.h是本 BSP 经 menuconfig 裁剪后的最终配置集中反映了该平台的基本运行形态内核基础RT_NAME_MAX 12、RT_THREAD_PRIORITY_MAX 32、RT_TICK_PER_SECOND 1001000 Hz 节拍可由用户调整、空闲线程栈 256 字节内存管理启用RT_USING_SMALL_MEM_AS_HEAP小内存管理算法作为默认堆并开启RT_USING_MEMPOOL内存池后续又定义了RT_PAGE_AFFINITY_BLOCK_SIZE 0x10004 KB 页与RT_PAGE_MAX_ORDER 11对应 MMU 页式内存管理ARCH_MM_MMU组件启用RT_USING_COMPONENTS_INIT自动初始化机制、RT_USING_MSH/FINSH_USING_MSH命令行 Shell线程tshell优先级 20栈 4 KB命令最长 80 字符、RT_USING_DFS虚拟文件系统含 devfs最多 16 个文件描述符设备驱动启用RT_USING_SERIAL串口框架 V1支持 DMA 模式接收缓冲 64 字节与RT_USING_PINGPIO 框架控制台RT_CONSOLE_DEVICE_NAME uart1明确指定 UART1 作为系统调试控制台输出缓冲 128 字节架构相关ARCH_ARM_CORTEX_A、ARCH_ARM_CORTEX_A7、RT_USING_GIC_V2、RT_USING_HW_ATOMIC硬件原子操作、RT_USING_CACHE外设与 SoCRT_USING_UART1仅启用 UART1 实例与SOC_MCIMX6X4。这些宏与drivers/serial.c中的#ifdef RT_USING_UART1条件编译、board.c中的 MMU 描述表一一对应构成了配置宏 → 驱动实例的清晰映射。内存映射与 MMUplatform_mem_desc 与链接脚本Cortex-A 处理器必须开启 MMU 才能稳定运行 RT-Thread本 BSP 的内存映射定义在drivers/board.cbsp/nxp/imx/imx6ul/drivers/board.cstruct mem_desc platform_mem_desc[] { {0x00000000, 0x80000000, 0x00000000, DEVICE_MEM}, {0x80000000, 0xFFF00000, 0x80000000, NORMAL_MEM} };该表将地址空间划分为两段0x00000000 ~ 0x80000000映射为DEVICE_MEM设备内存不可缓存用于访问外设寄存器0x80000000 ~ 0xFFF00000映射为NORMAL_MEM普通可缓存内存对应 1 GB DDR3 的地址范围。platform_mem_desc_size则供 MMU 初始化代码遍历该表建立页表。内存布局的另一半由 GCC 链接脚本 link.lds 决定其关键设计如下首地址为0x80100000即代码从 DDR3 起始地址偏移 1 MB 处加载.text段依次包含向量表、代码、finsh 符号表FSymTab/VSymTab供FINSH_USING_SYMTAB使用、模块符号表RTMSymTab以及按SORT(.rti_fn*)排序的自动初始化函数表__rt_init_start ~ __rt_init_end——这正是 RT-ThreadINIT_BOARD_EXPORT/INIT_APP_EXPORT自动初始化机制的落点紧随其后是.ARM.exidx异常展开表、.rodata、构造函数/析构函数段以及按 16 KB 对齐、预留 16 KB 空间的.l1_page_table一级页表段__l1_page_table_start.data与.bss段结尾处的__bss_end符号正是board.h中堆起点HEAP_BEGIN的取值来源。堆范围在 drivers/board.h 中定义为从__bss_end到0x80000000 32MB即系统堆占用 DDR 前 32 MB 中未被代码、数据占用的剩余部分。系统时钟与节拍EPIT1 定时器驱动RT-Thread 的系统节拍由 i.MX6 的 EPITEnhanced Periodic Interrupt Timer外设提供。drivers/board.c中的rt_hw_timer_init()完整实现了定时器的初始化流程关闭并清零 ARM 全局定时器Global Timer使能其运行作为时间基准通过get_main_clock(IPG_CLK)获取 IPG 总线时钟频率以 IPG 时钟为源CLKSRC_IPG_CLK将 EPIT1 配置为 SET_AND_FORGET装载-递减模式以freq / 1000000作为分频值、计数初值 10000并启用 WAIT/STOP 模式支持调用epit_counter_enable()启动计数器并选择 IRQ 模式将rt_hw_timer_isr注册到IMX_INT_EPIT1中断向量并打开中断屏蔽。中断服务函数rt_hw_timer_isr()只做两件事调用rt_tick_increase()递增 RT-Thread 系统节拍以及调用epit_get_compare_event()清除 EPIT 比较事件标志。整个初始化通过INIT_BOARD_EXPORT(rt_hw_timer_init)挂入自动初始化机制在板级初始化阶段自动执行drivers/board.c。这种EPIT 递减计数器 中断内递增 tick的模式是 i.MX 系列 RT-Thread 移植的通用做法。串口驱动UART1 控制台与引脚复用系统控制台依赖 UART1其实现分为三层。第一层引脚复用iomux。drivers/iomux/uart_iomux_config.c 定义了 UART1 TX/RX 引脚的 IOMUX 配置宏MX6UL_PAD_UART1_TX_DATA__UART1_TX与MX6UL_PAD_UART1_RX_DATA__UART1_RX分别写入 MUX 控制寄存器偏移 0x084/0x088、Daisy Chain 选择寄存器偏移 0x624与 PAD 控制寄存器偏移 0x310/0x314pad_setting 值 0x10b0对应特定的驱动能力/上下拉配置。uart1_iomux_config()完成实际写入而iomux_config()统一调用它。值得注意的是uart_iomux_config()的分发函数中 UART6/7/8 均错误地回落到uart5_iomux_config()从源码结构看该分发函数仅对 UART1 做了完整实现其余实例尚未接线这与rtconfig.h只定义RT_USING_UART1的裁剪是一致的。第二层串口框架驱动。drivers/serial.c 实现了struct rt_uart_ops的四个回调uart_configure依据serial_configure将数据位/停止位/校验位映射为 i.MX UART 寄存器值调用 SDK 的uart_init()初始化硬件并设置 RX FIFO 中断模式、uart_control响应RT_DEVICE_CTRL_SET_INT/CLR_INT开断 RX 中断、uart_putc/uart_getc字符级收发。中断服务例程rt_hw_uart_isr()收到 RX 中断后调用rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND)通知串口框架进行接收。第三层设备注册。rt_hw_uart_init()以 115200-8-N-1BAUD_RATE_115200、DATA_BITS_8、PARITY_NONE、STOP_BITS_1为默认配置为 UART1 实例HW_UART1IMX_INT_UART1注册名为uart1的设备标志为RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX读写 中断接收随后通过INIT_BOARD_EXPORT自动执行。注册完成后board.c的rt_hw_board_init()中rt_console_set_device(uart1)将控制台绑定到该设备Shell 与rt_kprintf输出即可经此串口工作。启动流程从 main 到调度器applications/startup.capplications/startup.c给出了标准的 RT-Thread Cortex-A 启动序列main()先关闭中断随后调用rtthread_startup()其内部顺序为rt_hw_interrupt_init()初始化 GIC 中断控制器rt_hw_board_init()使能 NEON/FPUenable_neon_fpu()、关闭严格对齐检查disable_strict_align_check()、执行rt_components_board_init()完成板级自动初始化串口、定时器均在此阶段就绪并设置控制台设备rt_show_version()打印 RT-Thread 版本信息rt_system_heap_init(HEAP_BEGIN, HEAP_END)初始化堆内存rt_system_scheduler_init()/rt_system_timer_init()/rt_system_timer_thread_init()初始化调度器与软定时器rt_application_init()创建应用线程rt_thread_idle_init()创建空闲线程rt_system_scheduler_start()启动调度器此后系统不再返回。应用线程的创建位于applications/application.c配合FINSH_USING_MSH配置系统启动后即可在 UART1 上进入msh命令行执行内核信息查看、设备调试等 finsh 命令。小结一份可复用的 Cortex-A 异构平台 BSP 范例围绕 bsp/nxp/imx/imx6ul/README.md 描述的 i.MX6 SoloX SABRE 硬件本 BSP 用一份精简但完整的源码集给出了 RT-Thread 在带 MMU 的 Cortex-A 平台上的标准落地方式通过pkgs --update集成 NXP 官方 SDK 包以rtconfig.h完成内核与组件裁剪用platform_mem_desclink.lds搭建 MMU 映射与内存布局以 EPIT 定时器驱动系统节拍以串口框架 IOMUX 支撑控制台与 Shell。对于需要在 i.MX6UL/6ULL/SoloX 系列上评估 RT-Thread或希望参照移植到其他 Cortex-A 处理器的开发者这份 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 在 NXP i.MX6 SoloXSABRE 智能设备板上的 BSP 移植与运行指南RT Thread 在 NXP i.MX6 SoloXSABRE 智能设备板上的 BSP 移植与运行指南 导读 本文以 RT Thread 仓库中 bsp/操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 的 GD32107C-EVAL 开发板 BSP 移植与使用指南RT Thread 的 GD32107C EVAL 开发板 BSP 移植与使用指南 本指南以 RT Thread 仓库中 bsp/gd32/arm/gd3210操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 NXP i.MX RT1170 EVK 上的 BSP 移植与实战指南RT Thread 在 NXP i.MX RT1170 EVK 上的 BSP 移植与实战指南 本篇技术指南以 RT Thread 仓库中 bsp/nxp/imx操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询