当前位置: 首页 > news >正文

NVIC_SYSTEMRESET失败卡死

问题:

最基础的软复位失败,执行到这个函数之后出现卡死的情况,后续直接触发看门狗复位

解决:

用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的优化)后问题解决。

详细分析

  1. IAR调试环境下软复位表现正常:

    • CPU请求到初始化配置(startup.s文件)流程完整
    • Boot和App的ELF文件反汇编验证无异常
    • 向量表无覆盖现象
    • StackTop、Vector、ResetHandler、Main地址均正确
    • 在IAR环境下可正常执行后续流程
  2. GCC编译问题现象:

    • 执行特定函数时出现卡死
    • 添加DSB/ISB指令和延时均无效
    • 最终通过降低优化级别解决问题(Os→Og)
    • 使用M0+内核CPU,具体原因尚未明确
    • 推测Os优化可能导致代码重排,但具体影响机制不明
  3. 其他相关经验:

    • set_msp和PC指针跳转曾出现过问题,主要原因是:
      • 中断未正确清除
      • 高优化级别导致不应内联的函数被自动内联
    • 多级调用时需特别注意volatile修饰符的有效性
    • 关键变量建议使用调试器实时监控
  4. 编译器对比:

    • GCC的编译优化效果不及IAR
    • IAR在高优化级别下功能正常,而GCC会出现异常
    • 具体差异原因尚不明确后续找出问题会补

用gcc的话编译优化开高了真的会有奇怪的问题加上也可能是因为代码本身结构有漏洞,但是目前来看变量分层传递层间解耦都做的很好,有时间还是要看看gcc优化实际是在做什么,而且对于需要产品化工程化的项目又只能用gcc所以常见的问题一定要熟悉,否则很耗时间。光是定位一个跳转失败的问题就定位了很久,像是先开低级别优化不正常之后逐条删除优化选项看哪个优化影响到了功能最后才定位到是内联的问题,然后通过反汇编找不能内联的函数是不是内联了。。。

http://www.cnnetsun.cn/news/2995105.html

相关文章:

  • 6.24线上DevCon预约:OpenVINO™开源AI朋友圈,等你来加入
  • RTranslator离线翻译模型快速部署终极指南:告别漫长下载,5分钟完成安装
  • HarmonyOS ArkUI 自定义跑道布局:CustomMultiChildLayout 模式深度实践
  • Emscripten如何重塑Web技术栈:从原生代码到WebAssembly的战略架构迁移
  • 如何用Globe.GL打造惊艳的3D地球数据可视化:从零到一的实战指南
  • 36氪新浪潮大会:值得买科技朱越分享AI时代消费决策链路变化与品牌应对策略
  • 易元智创APP:AI智能画面去杂物,海南易元现实科技有限公司一键净化实拍场景
  • linux内核中阶梯判断switch-case的一种罕见用法(连续阶梯值的情况)
  • 简单代码审计
  • 为什么现在所有大厂都在做 CLI ?(附Cluade Code接入飞书CLI教程)
  • 进程、线程、协程与Java虚拟线程
  • Dify、Cursor、Chatbox、Cherry Studio 怎么统一接入:Base URL、模型 ID 和 API Key 验收清单
  • 卵巢早衰备孕还有机会吗
  • 用 Typeoff 口述代码思路:从原始想法到结构化 Markdown
  • AVR单片机内部温度传感器校准指南:从原理到单点/两点校准实践
  • XMEGA A3BU嵌入式开发实战:低功耗、高精度ADC与时钟系统深度优化
  • ATtiny88 SPI与TWI通信接口:寄存器级配置与实战避坑指南
  • 嵌入式安全芯片HAL层开发指南:从CryptoAuthLib原理到STM32实战
  • ATmega单片机端口复用:从GPIO到SPI/ADC/中断的实战配置与冲突解决
  • ATmega164P/324P/644P嵌入式实战:选型、低功耗与汽车级应用
  • CD5283/CD5314电流调节器芯片:从恒流原理到PCB设计实战
  • 备孕期为什么要补充维生素b?高仕星维生素b帮你打好营养基础
  • Curiosity Nano Base硬件平台:标准化连接如何提升嵌入式开发效率
  • ARM7TDMI编程模型与Thumb指令集:嵌入式开发的底层基石
  • 天峰律政代表的合规公关派正在重塑行业服务标准
  • KA Music:酷狗概念版纯净轻量替代品,无损音质免费畅听
  • Go语言的sync.Map条件操作
  • 理解「数据网格」(Data Mesh)及其对数据平台架构的影响
  • 分布式系统一致性算法详解
  • 软件直方图管理化的分布分析