STM32MP157F Cortex-M4调试时g_pfnVectors指向0x0问题求助
STM32MP157F M4核心调试:g_pfnVectors异常与内存区域配置修复
核心问题定位
1. 向量表地址映射错误
你遇到的g_pfnVectors() at 0x0无源码问题,核心原因是链接脚本中向量表的物理地址配置错误:
STM32MP1的M4核心在生产模式下,RETRAM的物理起始地址是0x38000000,M4的虚拟地址0x0通过MMU映射到该物理地址。但你的链接脚本将RETRAM_interrupts的起始地址设为0x0,导致向量表没有被正确加载到RETRAM的物理地址空间,调试时虚拟地址0x0没有有效向量数据。
2. 链接脚本与设备树内存区域不匹配
对比你的链接脚本和设备树配置,存在多处冲突:
- SRAM2_data区域越界:链接脚本中
SRAM2_data起始地址为0x30020000、长度200K,结束地址为0x30052000,但设备树中mcuram仅保留了0x30000000-0x30040000(256K),后半段0x30040000-0x30052000未被Linux内核保留,可能被系统占用,引发访问冲突或数据溢出。 - IPC区域重叠:链接脚本中
SRAM3_ipc_shm覆盖了0x10040000-0x10050000,但设备树中该区域已分配给vring、buffer和资源表等IPC共享区域,会导致M4代码/数据与IPC通信区域重叠,引发异常。
具体修复步骤
步骤1:修正向量表的物理地址配置
修改链接脚本的MEMORY块,将RETRAM_interrupts的起始地址改为RETRAM物理地址0x38000000,同时确保向量表在链接时被正确放置:
MEMORY { RETRAM_interrupts (xrw) : ORIGIN = 0x38000000, LENGTH = 0x00000600 SRAM1_text (xrw) : ORIGIN = 0x10000000, LENGTH = 256K SRAM2_data (xrw) : ORIGIN = 0x30000000, LENGTH = 256K // 匹配设备树mcuram区域 SRAM3_ipc_shm (xrw) : ORIGIN = 0x10050000, LENGTH = 64K // 移至IPC区域之后 SRAM4 (xrw) : ORIGIN = 0x10060000, LENGTH = 64K }
在链接脚本的SECTIONS块中,明确向量表的放置规则:
SECTIONS { .isr_vector : { . = ALIGN(4); __Vectors = .; KEEP(*(.isr_vector)) /* 强制保留向量表 */ . = ALIGN(4); } > RETRAM_interrupts AT> RETRAM_interrupts /* 其他代码段、数据段配置... */ }
步骤2:对齐链接脚本与设备树的内存区域
- 确保
SRAM2_data完全落在设备树mcuram的保留范围内(0x30000000-0x30040000),避免越界。 - 将
SRAM3_ipc_shm移至0x10050000,避开设备树中已分配的IPC共享区域(0x10040000-0x10050000)。 - 所有链接脚本中的内存区域,必须完全包含在设备树
reserved-memory定义的对应区域内,无重叠、无越界。
步骤3:验证向量表加载与SRAM使用
- 编译后查看工程的
.map文件,确认__Vectors的物理地址为0x38000000,虚拟地址0x0会通过MMU映射到该地址。 - 调试时查看
0x38000000地址的内存内容,应能看到有效的中断向量数据。 - 检查编译输出是否有内存溢出警告(如
section .data will not fit in region SRAM2_data),若有则调整堆/栈大小或优化代码:
进入Project Properties > C/C++ Build > Settings > MCU Linker > Memory Settings,合理配置堆(Heap)和栈(Stack)的大小。 - 使用IDE的内存分析工具,确认数据段、堆、栈的总占用不超过对应SRAM区域的长度。
步骤4:确认remoteproc配置有效性
你的m4_rproc设备树配置已包含所有M4使用的内存区域,这部分无需修改,但需确保memory-region列表中的区域与链接脚本的内存区域一一对应,无遗漏。
内容的提问来源于stack exchange,提问作者Juan Pablo Toro Arenas
相关产品推荐
相关产品推荐

