NVIC_SYSTEMRESET失败卡死 📅 2026/6/24 2:49:12 问题最基础的软复位失败执行到这个函数之后出现卡死的情况后续直接触发看门狗复位解决用gcc开了高级别优化之后降低优化级别相关问题描述在iar调试里做软复位看着从向cpu发请求到执行初始化配置startup.s文件都正常boot和app的elf反汇编之后也能确保没有出现向量表覆盖或是函数异常的情况stacktop vector resethandler main地址都正常iar里都能正常往后执行但是用gcc编的时候执行到这个函数就会卡死在执行前加dsb isb加延时都没有用最后实在无法定位和解决还是降了优化级别从Os到Og去除对于flash 的优化就正常了用的是m0的cpu至今还不知道是为什么会有这样的问题Os优化可能会重排代码但是具体为什么会造成这个后果的原理还不清楚之前做set_msp和移pc指针跳转的形式也会出现问题一种是因为漏清了中断还有一个就是因为开优化开高了把不能内联的函数自动内联了还有就是多级调用的时候要注意volatile的有效性对于需要这种特性的变量最好还是用调试器监控一下gcc的编译优化效果其实还没有iar的开高优化效果好但是不知道差别是什么iar高优化之后功能还是正常的但是gcc不行问题描述软复位基础功能失败执行特定函数后系统卡死最终触发看门狗复位。解决方案将GCC的高级优化级别Os降低为Og去除对Flash的优化后问题解决。详细分析IAR调试环境下软复位表现正常CPU请求到初始化配置startup.s文件流程完整Boot和App的ELF文件反汇编验证无异常向量表无覆盖现象StackTop、Vector、ResetHandler、Main地址均正确在IAR环境下可正常执行后续流程GCC编译问题现象执行特定函数时出现卡死添加DSB/ISB指令和延时均无效最终通过降低优化级别解决问题Os→Og使用M0内核CPU具体原因尚未明确推测Os优化可能导致代码重排但具体影响机制不明其他相关经验set_msp和PC指针跳转曾出现过问题主要原因是中断未正确清除高优化级别导致不应内联的函数被自动内联多级调用时需特别注意volatile修饰符的有效性关键变量建议使用调试器实时监控编译器对比GCC的编译优化效果不及IARIAR在高优化级别下功能正常而GCC会出现异常具体差异原因尚不明确后续找出问题会补用gcc的话编译优化开高了真的会有奇怪的问题加上也可能是因为代码本身结构有漏洞但是目前来看变量分层传递层间解耦都做的很好有时间还是要看看gcc优化实际是在做什么而且对于需要产品化工程化的项目又只能用gcc所以常见的问题一定要熟悉否则很耗时间。光是定位一个跳转失败的问题就定位了很久像是先开低级别优化不正常之后逐条删除优化选项看哪个优化影响到了功能最后才定位到是内联的问题然后通过反汇编找不能内联的函数是不是内联了。。。