i.MX RT1160平台eRPC与USB MSD因USE_SHMEM冲突问题求助
i.MX RT1160 eRPC与USB MSD共存问题排查与解决
环境配置
- 硬件:i.MX RT1160评估套件
- 核心分工:
- CM7:运行Azure RTOS(ThreadX、FileX、UsbX)+ eRPC
- CM4:运行裸机程序 + eRPC
冲突现象
- 启用eRPC预处理器宏
USE_SHMEM:eRPC功能正常,但UsbX驱动的USB大容量存储设备(MSD)无法在Windows资源管理器中被识别 - 关闭
USE_SHMEM:UsbX MSD功能正常,但eRPC无法工作 - 推测根因:内存分配区域冲突
排查与解决思路
1. 检查内存区域重叠
查看内存配置与链接器脚本,确认eRPC共享内存(USE_SHMEM启用时的分配区域)与UsbX MSD使用的内存(如批量传输缓冲区、FileX存储缓存区)是否存在地址范围重叠。确保两类内存段的起始地址、大小完全隔离,无交叉覆盖。
2. 调整内存分配策略
- 为eRPC共享内存分配独立内存块:在链接器脚本中为
SHMEM段指定i.MX RT1160中未被Azure RTOS组件占用的物理内存(如OCRAM的空闲区域或SDRAM的专属分区),明确其地址范围不与USB相关内存需求冲突。 - 隔离UsbX内存池:通过
ux_system_initialize接口或相关配置宏,指定UsbX使用的内存池地址避开eRPC共享内存区域,避免内存资源抢占。
3. 调整初始化顺序
确保eRPC共享内存的初始化与UsbX驱动的初始化顺序合理,避免初始化过程中内存区域被错误覆盖。例如在CM7的ThreadX启动流程中,优先完成共享内存的初始化,再启动UsbX驱动;或反之,根据内存依赖关系调整顺序。
4. 排查宏定义副作用
确认USE_SHMEM宏仅作用于eRPC的共享内存逻辑,不会间接修改Azure RTOS组件的内存配置(如ThreadX内存池大小、UsbX缓冲区参数)。检查eRPC头文件中该宏的作用范围,排除意外的全局宏污染。
5. 调试USB枚举流程
启用UsbX调试日志,查看USE_SHMEM启用时USB MSD枚举过程中的错误信息,定位具体失败环节:
- 检查
ux_device_class_msd_initialize是否存在内存分配失败 - 验证批量传输缓冲区地址是否有效
- 查看USB设备描述符、配置描述符的传输是否正常
内容的提问来源于stack exchange,提问作者CmBe
相关产品推荐
相关产品推荐

