i.MX RT1180 双核 BSP 实战:从编译下载到 CM33 拉起 CM7 核间通信

发布时间:2026/11/4 15:36:54
i.MX RT1180 双核 BSP 实战:从编译下载到 CM33 拉起 CM7 核间通信 i.MX RT1180 双核 BSP 实战从编译下载到 CM33 拉起 CM7 核间通信【免费下载链接】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一、一块双核板两个独立工程分工先看清楚i.MX RT1180 把800 MHz 的 Cortex-M7和240 MHz 的 Cortex-M33带 TrustZone 安全扩展放进同一颗芯片配双千兆以太网与 EtherCAT 等工业接口。RT-Thread 仓库里这块 EVK 的 BSP 采用双核独立编译CM33 工程负责安全启动、系统管理与核间通信CM7 工程承担算力密集任务两个工程分别编译、分别下载主核在运行时负责把从核的镜像搬过去并拉起。对照项CM33 工程cm33/CM7 工程cm7/架构宏ARCH_ARM_CORTEX_M33ARCH_ARM_CORTEX_SECUREARCH_ARM_CORTEX_M7ARCH_ARM_CORTEX_FPU默认控制台LPUART1uart1LPUART12uart12串口 DMA 通道RX 0 / TX 1RX 22 / TX 23启动后打印MIMXRT1180_CM33 Hello_WorldMIMXRT1180_CM7 Hello_World附加动作板载 LEDGET_PIN(4, 27)每 500 ms 翻转无以上均写死在各自的rtconfig.h里两工程版本同为 RT-Thread 5.x。二、动手前清单硬件怎么连用数据线把 EVK 连到 PC板上自带 CMSIS-DAP 调试器打开电源开关。双核调试要接两根串口线CM33 走 UART1CM7 走 UART12终端里各开一个窗口参数统一115200-8-1-N。为什么必须先跑pkgs --update两个核的rtconfig.h都定义了PKG_USING_NXP_IMXRT_DRIVER——编译依赖 NXP IMXRT 驱动包包内含 MIMXRT1189 SDK 的头文件与驱动源文件仓库里不带这些库。跳过这一步scons 会因缺头文件直接失败这是新手踩得最多的一坑。进入核工程目录如cm33/在 ENV 工具中执行pkgs --update它会按rtconfig.h的包配置从在线包管理器拉取驱动包之后才能进入编译。三、第一次跑起来三种工具链各自的生成与下载命令IAR 与 MDK5生成工程后编译下载在核工程目录执行scons --targetiar生成 IAR 工程双击project.eww打开编译后点击下载即可——工程默认走 CMSIS-DAP连好板子直接烧录。MDK5 对应scons --targetmdk5在 Keil 里 Build and Download。两条命令的区别只在你用哪套 IDE生成的工程文件都落在对应核目录下。GCC直接编译GCC 路径不生成 IDE 工程直接编译scons -j8-j8表示 8 线程并行编译省掉该参数则单线程。产物在build/目录。下载可用 J-Link目录里备好了evkmimxrt1180.mac、evkmimxrt1180_cm33.jlinkscript和三种内存布局对应的.ini文件。确认两个核各自活了下载成功后系统自动运行复位设备。CM33 串口窗口先看到启动 banner再看到 hello 打印板载 LED 以 500 ms 周期闪烁\ | / - RT - Thread Operating System / | \ 5.2.2 build May 15 2026 17:19:35 2006 - 2024 Copyright by RT-Thread team MIMXRT1180_CM33 Hello_WorldCM7 窗口看到MIMXRT1180_CM7 Hello_World即表示从核工程独立跑通。注意此时 CM7 是被调试器单独拉起的主核自动拉从核要靠第四章的多核开关。四、menuconfig 四步开启外设四步流程menuconfig、pkgs、scons 重新生成在核工程目录如cm33/下打开 ENV 工具执行menuconfig勾选外设保存退出执行pkgs --update更新软件包新开关可能引入新依赖执行scons --targetmdk5或iar重新生成工程GCC 用户直接scons。BSP 默认只开了最小集GPIO、LPUART1RX/TX DMA 全开、QSPI Flash 与 DMA。其余全关想用什么勾什么。常用 Kconfig 开关速查外设开关集中在 cm33/board/Kconfigcm7 侧结构相同高频项速查宏默认作用BSP_USING_LPUART1/LPUART2~12LPUART1 开每路串口独立使能可单独配 RX/TX DMA 通道0~32BSP_USING_SPI1~4LPSPI关每路可开 DMA 并指定通道BSP_USING_I2C1/2/3/6LPI2C关每路二选一100 kHz / 400 kHz可开 DMABSP_USING_CAN→FLEXCAN3CAN 关勾选后 CAN3 默认开FLEXCAN3 驱动BSP_USING_DWT关周期计数与微秒级忙等延时dwt_delay_usBSP_USE_HYPERRAM关板载 HyperRAM 作扩展内存BSP_USING_ETH关自动选中 lwIP/SAL/netdevNETC_USE_SWT选 0EP0 直连/1switchPHY 默认开BSP_USING_FS关下挂 SD 卡 FATFS 或 QSPI Flash LittleFS后者依赖 FAL 分区表BSP_USING_QSPI_FLASH关外部 NOR Flash 读写驱动另USBCherryUSB可选 OTG1/OTG2 与 Device/Host 角色Host 下还能开鼠标 demoSDIO 可进一步设CODE_STORED_ON_SDCARD用 SD 卡作启动设备。PWM 在文档中标注暂不支持规划在后续版本先别找这个菜单。链接脚本三选一切换内存布局菜单末尾的Linker Script Selection三选一对应board/linker_scripts/下不同后缀的.ld/.icf/.scfBSP_LINKER_SCRIPT_RAM镜像全部放内部 SRAM 运行rtthread_ramBSP_LINKER_SCRIPT_FLEXSPI_NOR默认项代码在 FlexSPI 外部 NOR Flash 上 XIP 执行rtthread_flexspi_norBSP_LINKER_SCRIPT_FLEXSPI_NOR_HYPERRAMXIP 执行 HyperRAM 当附加 RAMrtthread_flexspi_nor_hyperram。rtconfig.py会扫描rtconfig.h里的BSP_LINKER_SCRIPT_*宏自动选脚本生成 Keil 工程时把project.uvoptx的当前 Target 同步为上面三个名字之一——menuconfig 里切一下、重新生成布局就换好了。想跑 HyperRAM 布局记得同时勾上BSP_USE_HYPERRAM驱动。五、两个核如何协作主核六步拉起从核MCMGR 启动链在 CM33 侧勾上BSP_USE_MULTICORE其下BSP_USE_MULTICORE_KICK_OFF与BSP_USE_MULTICORE_RPMSG_LITE均默认开。逻辑集中在 cm33/applications/multicore_thread.c由multicore_init()经INIT_APP_EXPORT在应用初始化阶段自动创建multicore线程栈 2048 字节、优先级 10、时间片 5线程内依次做六件事MCMGR_Init()初始化多核管理单元CM33 以 master 身份运行MCMGR_RegisterEvent()注册远端应用事件回调用来接收 CM7 的就绪信号BOARD_GetCore1ImageAddrSize()取 CM7 镜像的源地址、目的地址、大小与启动地址并逐行打印出来供你核对BOARD_PrepareCore1()把镜像搬运到目标内存MCMGR_StartCore()同步启动 CM7同时把 RPMsg 共享内存基址传给从核轮询等待 CM7 上报就绪事件每 10 ms 查一次串口打印CM7 core is ready!后进入通信阶段。Kconfig 的 help 写得很直白CM33master启动 CM7remote时这套 Kick-off 是正确初始化顺序所必需的——从核的镜像、复位向量、共享内存参数都要由主核准备好它自己无法凭空醒来。RPMsg-Lite端点、队列与名称服务怎么建RPMsg-Lite 核间通信走共享内存。主核侧定义 6144 字节的rpmsg_lite_base[]数组按编译器分别放进指定段——IAR 用#pragma locationKeil 用 section 属性GCC 用.noinit.$rpmsg_sh_mem段定义必须与链接脚本匹配否则内存拿不到。初始化顺序以 master 身份rpmsg_lite_master_init()→ 创建接收队列 → 创建本地端点地址 40→rpmsg_ns_bind()绑定名称服务然后原地等待从核广播。CM7 侧的从核工程里初始化后调用rpmsg_ns_announce()用rpmsg-openamp-demo-channel这个服务名广播自己的端点主核的等待循环被唤醒拿到远端端点地址打印Got remote endpoint address。之后进入 ping-pong 验证双方互发 4 字节数据计数从 0 到 100 共 100 轮串口逐轮打印 ping/pong收尾时依次销毁端点、队列、解绑名称服务并rpmsg_lite_deinit()。四个可配置项与源码里的#ifndef兜底值一一对应RPMSG_LITE_LINK_ID默认 0、RPMSG_LOCAL_EPT_ADDR默认 40范围 0~65535、RPMSG_NS_ANNOUNCE_STRING默认rpmsg-openamp-demo-channel、RPMSG_SHARED_MEM_SIZE默认 6144 字节不显式配置也按默认值跑。六、踩坑与排错双核 BSP 常见翻车点当成了一个工程CM33 与 CM7 是两套独立工程各自pkgs --update、各自编译下载主核侧搬运的 CM7 镜像必须来自对应工具链的最新构建。串口对不上CM33 控制台是 UART1CM7 是 UART12。把线接反后一边的窗口永远安静先核对rtconfig.h的RT_CONSOLE_DEVICE_NAME再怀疑系统挂了。编译报缺头文件/缺库十有八九是pkgs --update没跑或没在正确核目录跑见第二章。Keil Target 对不上脚本改完链接脚本选项不重新生成工程Target 还停在旧布局或手改过 uvoptx 忘了同步运行时表现是启动异常、变量越界把 Target 重新对齐即可。主核死等从核就绪若主核打印卡在Waiting for CM7 core ready signal...优先检查 RPMsg 共享内存段名是否与链接脚本一致、RPMSG_SHARED_MEM_SIZE是否两侧相同。PWM 暂不支持需要 PWM 的话先看同系列 BSP 或等版本更新。七、收尾这块板子还能往哪走同目录的bsp/nxp/imx/imxrt/下还有 imxrt1021/1052/1060/1064/1170 等工程可横向对照双核写法。应用方向上NETC 双千兆 EtherCAT lwIP 的组合适合做工业通信网关电机控制则让 CM7 跑 FPU 算法、CM33 守住安全启动与核间管理——这正是这块板子的设计意图。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询