PSoC4 MAX设备Bootloader与应用程序向量表访问及调试故障排查
核心结论:必须在应用程序的链接脚本中显式配置向量表位置
你的问题根源完全和向量表相关,具体原因和解决步骤如下:
为什么应用的Reset_Handler会出错?
Cortex-M0内核默认从0x00000000地址读取向量表(向量表第一个条目是初始栈指针,第二个就是Reset_Handler的入口地址)。你的Bootloader占用了0x00到0x5000的FLASH区域,而你没给应用程序显式指定向量表位置,编译时链接器会默认把应用的向量表放到0x00地址——这个区域属于Bootloader,会被Bootloader的内容覆盖,导致应用的Reset_Handler地址根本不在正确的向量表位置,内核找不到合法的入口,自然调试失败,甚至运行时崩溃。而Bootloader因为占了0x00起始地址,向量表位置正确,所以用同一起动文件没问题。应用放在0x5000以上会不会无法访问向量表?
不会,但你需要做两步关键配置:修改应用的链接脚本,强制向量表存到应用FLASH的起始地址
在你的链接脚本的SECTIONS块中添加向量表的指定,把它放到FLASH_Application区域的起始位置:SECTIONS { .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* 确保向量表段不被优化掉 */ . = ALIGN(4); } > FLASH_Application /* 保留你原有的其他SECTION配置(比如.text、.data等) */ }这样链接器就会把应用的向量表放在0x5000的起始位置,和应用代码一起存到专属的FLASH区域。
在应用代码中重映射向量表地址
Cortex-M0支持向量表重映射,你需要在应用程序的最开始(比如Reset_Handler的开头,或者main函数之前的初始化代码里)设置SCB寄存器的VTOR字段,告诉内核向量表的新地址:SCB->VTOR = 0x00005000; /* 向量表起始地址,和应用FLASH起始地址一致 */注意:这个操作必须在启用中断之前完成,否则中断会跳转到错误的地址。
调试失败的额外检查点
除了向量表配置,还要确保Eclipse的调试配置中,应用程序的加载起始地址设置为0x5000,MiniProg4调试器能正确识别应用的FLASH区域;同时Bootloader的跳转逻辑要正确——跳转到应用的Reset_Handler时,应该跳转到0x5000 + 4(因为向量表第一个条目是栈指针,第二个才是Reset_Handler的入口地址)。
内容的提问来源于stack exchange,提问作者nobby

