You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:34:54