【技术支持案例】S32K146的hard fault问题处理

文章目录

    • 1. 案例背景
    • 2. 方案准备
      • 2.1 HardFault(硬件错误异常)
      • 2.2 UsageFault(用法错误异常)
      • 2.3 BusFault(总线错误异常)
      • 2.4 MemManage Fault(存储器管理错误异常)
    • 3. 现场支持
      • 3.1 现场环境
      • 3.2 排查过程
    • 4. 异常模拟
      • 4.1 测试环境
      • 4.2 测试过程

1. 案例背景

最近有个客户使用S32K146的产品在量产之后出现了三个售后件,ABBA测试之后的结果表明失效现象跟着S32K146走;同时客户反馈说试着将其中一个售后件重新烧录程序,S32K146又正常工作了。结合这两种情况,S32K146应该是没有损坏的,那就需要从软件程序方面排查了。

然后和客户的软件工程师交流了一下,使用Attaching to Running Target的方式发现程序卡死在HardFault。因为是量产产品出问题,客户强烈要求去现场处理问题,特地记录下这次处理S32K146的hard fault问题的过程,希望对读者有帮助。

2. 方案准备

在这之前,笔者还没有处理过S32K1系列发生HardFault的问题,所以需要先对S32K1系列发生HardFault的原因进行了解。推荐如下这篇文章,讲的非常细致。

  • S32K1xx系列MCU的常见内核异常(Fault Exception)及处理详解(以S32K144为例介绍)

结合上面这篇文章以及ARM官方的M4内核文档Cortex -M4 Devices Generic User Guide,笔者简要整理了下S32K1发生HardFault的可能原因以及排查方式,如下文所述。

2.1 HardFault(硬件错误异常)

  • HardFault的可能原因
    1. 停止调试关闭时发生了调试事件;
    2. UsageFault、BusFault、MemManage Fault未使能(Coretex-M4F内核默认状态)时发生了相应的错误导致错误升级到HardFault;
    3. 异常处理过程中取内核中断向量表读操作错误。
  • HardFault的原因排查
    造成HardFault的原因,可通过SCB模块的硬件错误状态寄存器(HFSR)进行排查,如下所示:
    • 原因1引起的,DEBUGEVT bit置1;
    • 原因2引起的,FORCED bit置1;
    • 原因3引起的,VECTTBL bit置1。

HFSR寄存器

2.2 UsageFault(用法错误异常)

  • UsageFault的可能原因
    1. 执行未定义指令,即非法指令;
    2. 指令执行状态错误;
    3. 异常返回错误;
    4. 尝试访问关闭或者不可用的协处理器;
    5. 非对齐地址访问(需要先通过SCB模块的CCR寄存器进行使能);
    6. 除零操作(需要先通过SCB模块的CCR寄存器进行使能)。
  • UsageFault的原因排查
    造成UsageFault的原因,可通过SCB模块的用法错误状态寄存器(UFSR)进行排查,如下所示:
    • 原因1引起的,UNDEFINSTR bit置1;
    • 原因2引起的,INVSTATE bit置1;
    • 原因3引起的,INVPC bit置1;
    • 原因4引起的,NOCP bit置1;
    • 原因5引起的,UNALIGNED bit置1;
    • 原因6引起的,DIVBYZERO bit置1。

UFSR寄存器

2.3 BusFault(总线错误异常)

  • BusFault的可能原因
    1. Crossbar总线矩阵slave端口返回错误响应,当:
      • a. 异常/中断入口压栈;
      • b. 异常/中断返回出栈;
      • c. 预取指;
      • d. FPU lazy state现场保护;
    2. 精确总线错误;
    3. 不精确总线错误。
  • BusFault的原因排查
    造成BusFault的原因,可通过SCB模块的总线错误状态寄存器(BFSR)进行排查,如下所示:
    • 原因1.a引起的,STKERR bit置1;
    • 原因1.b引起的,UNSTKERR bit置1;
    • 原因1.c引起的,IBUSERR bit置1;
    • 原因1.d引起的,LSPERR bit置1;
    • 原因2引起的,PRECISERR bit置1;
    • 原因3引起的,IMPRECISERR bit置1。

BFSR寄存器

2.4 MemManage Fault(存储器管理错误异常)

  • MemManage Fault的可能原因
    1. 尝试加载和储存内核MPU保护的地址;
    2. 从内核MPU保护的地址取指;
    3. 由MPU违规引起的压栈和出栈(函数调用或者中断/异常处理)错误;
    4. 硬件FPU lazy state保护触发的MPU存储器保护违规。
  • MemManage Fault的原因排查
    造成MemManage Fault的原因,可通过SCB模块的存储器管理错误状态寄存器(MMFSR)进行排查,如下所示:
    • 原因1引起的,DACCVIOL bit置1;
    • 原因2引起的,IACCVIOL bit置1;
    • 原因3引起的,MSTKERR或MUNSTKERR bit置1;
    • 原因4引起的,MLSPERR bit置1;

MMFSR寄存器

UFSR、BFSR、MMFSR寄存器都是SCB模块中CFSR寄存器的子寄存器,包含关系如下,实际调试时查看CFSR寄存器即可。

CFSR寄存器

如果要访问UFSR、BFSR、MMFSR这些子寄存器,可以按照如下的地址进行访问:

CFSR子寄存器地址

3. 现场支持

了解了引起HardFault的可能原因以及排查方式之后,就是按照该方法协助客户进行原因排查。

3.1 现场环境

客户的现场环境如下:

  • 开发环境:IAR 8.30.1
  • 调试器:Jlink V9
  • MCU:S32K146
  • SDK:EAR0.8.6

3.2 排查过程

  1. 打开和异常件对应的软件工程,使用Attach方式连接上第一个异常件的主控S32K146,如下图所示:
  2. 进入仿真界面后,暂停之后发现程序卡死在hard fault。
  3. 查看S32的SCB模块,HFSR寄存器的FORCED bit置1,说明是其它错误上升到hard fault,需要查看CFSR寄存器了解更多信息。
  4. CFSR寄存器的BFARVALID bit 和PRECISERR bit都置1,说明是精确总线错误造成bus fault并且捕捉保存了精确总线错误发生时的数据访问地址;再去查看BFAR寄存器,发生错误时数据访问的地址是0x100010E8。
  5. 使用同样的方法排查第二个异常件的主控MCU,也是精确总线错误造成的bus fault,发生错误时数据访问的地址是0x10001128。
  6. 接着通过IAR查看下S32K146的memory,从地址0x10001128起始的8个字节长度的flash区域数据无法查看。
  7. 翻阅S32K1的memory相关的应用笔记AN11983: Using the S32K1xx EEPROM Functionality – Application Note,发生错误的地址属于D-Flash,如下图所示:

S32K1xx Memory Map

  1. 查阅软件代码中读写DFlash中这块地址的函数,发现在写DFLASH之前虽然进行了擦写操作,但是并没有设置擦写成功之后才能写DFlash的条件,有概率出现擦写不完全的情况下写D-Flash。同时,客户查看了其他组未出问题的产品的软件代码,在写D-Flash之前添加了比较多的条件判断,包含对擦写状态的判断。至此,该问题初步得到解决,剩下的就是优化代码并跟进后续产品的表现了。

4. 异常模拟

客户的问题虽然解决了,但是笔者还是不确定连续两次对同一块区域的Flash写不同的值,中间没有擦除动作,是否会让MCU卡在HardFault,所以使用手上的S32K144开发板进行了该情况的模拟。

4.1 测试环境

  • 开发环境:S32 Design Studio for ARM 2.2
  • SDK:RTM 3.0.0
  • 开发板:S32K144EVB-Q100

4.2 测试过程

  1. 打开S32DS 2.2,选择自带的例程flash_partitioning_s32k144
  2. 将初始化模拟EEPROM的部分注释掉,避免D-Flash被用作模拟EEPROM的备份区从而无法进行读写测试。
  3. 定义一套新数组并储存新的数据用于测试。
  4. 在正常的D-Flash写之后增加写入不同数据的操作。
  5. 编译之后进行debug,单步调试发现如果只进行写不同数据进入D-Flash,S32K144不会进入HardFault,需要再执行读D-Flash的操作,才会进入HardFault。

需要读取Flash地址的数据才会发生HardFault的原因,建议阅读下面这篇文章:

  • S32K1xx系列MCU应用指南之存储器ECC功能使用详解(二)
  1. S32DS之所以能在控制台显示比较多的MCU异常信息,是因为在调试器界面使能了异常捕捉功能,这部分功能依赖的是DEMCR寄存器,如下图所示。

异常捕捉配置

DEMCR寄存器

更多关于DEMCR寄存器的描述,可以查看如下这篇文档:

  • Armv7-M Architecture Reference Manual

如果觉得这篇文章对你有用,不妨给个一键三连!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127101.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础之static关键字

目录 静态的特点第一章、静态代码块第二章、静态属性第三章、静态方法调用静态方法时静态方法中调用非静态方法时 第四章、static关键字与其他关键字 友情提醒 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 静态的特点…

JVM学习(一)--程序计数器

作用:记住下一个jvm指令的执行地址 每一行java源代码,会被编译为多行jvm指令,上文所说的执行地址就是这里的0,3,4等 ,由于执行访问特别频繁,程序计数器的底层是有寄存器来实现的 特点: 线程私有&#xff…

kafka学习-生产者

目录 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 自定义序列化器 4、分区器 默认分区规则 自定义分区器 5、生产者拦截器 作用 自定义拦截器 6、生产者原理解析 1、消息生产流程 2、生产者常见参数配置 3、序列化器 基本概念 在Kafka中保存的数…

一文速学-让神经网络不再神秘,一天速学神经网络基础(七)-基于误差的反向传播

前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…

Linux安装kibana

相关链接 https://www.elastic.co/cn/downloads/kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz 官网下载可能比较慢,下面提供下载地址 百度云链接:https://pan.baidu.com/s/1d9Cqr9EwHF94op90F57bww 提取码…

Elasticsearch实战(五):Springboot实现Elasticsearch电商平台日志埋点与搜索热词

文章目录 系列文章索引一、提取热度搜索1、热搜词分析流程图2、日志埋点(1)排除logback的默认集成。(2)引入log4j2起步依赖(3)设置配置文件(4)配置文件模板(5&#xff09…

计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程,以及介绍jacoco的基本原理 测试过程 官网下载安装包解压到本地,https://www.jacoco.org/jacoco/ 只需要用…

vue.js+nodejs家庭个人理财收支管理系统5x6nf

本收支管理系统以vue.js作为框架,nodejs语言,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下: 1、绪论。综述了本文的研究背景…

Redis快速入门

文章目录 0. Redis介绍1. Centos下Redis安装2. redis.conf配置文件介绍3. redis相关命令4. 启动3.2 **命令行操作**3.3 Redis压测命令 4.redis中发布订阅和事务4.1 发布订阅(Pub/Sub)4.2 事务 5. redis封装系统服务6. 问题与解决6.1 启动Redis报错&#…

荣耀崛起阵容推荐,荣耀崛起最强阵容

今天给大家带来的荣耀崛起阵容推荐是新手阵容推荐,以核心输出为点,由点及面,来展开叙述阵容! 关注【娱乐天梯】,获取荣耀崛起0.1折内部福利号 荣耀崛起最强阵容兽族战神流: 此阵容是以战士为核心&#xff0…

机器学习_特征工程_特征数据的评价标准

本文主要从 单特征分析,多特征筛选,特征监控,外部特征评估的几个方面对特征数据进行阐述。 来源 : 特征筛选_特征覆盖度怎么算_adamyoungjack的博客-CSDN博客 1. 单特征分析 1.1 简介 好特征可以从几个角度衡量:覆…

geopandas 笔记: datasets 数据集

geopandas 自带的几个数据集 1 世界各个国家 import geopandas as gpd import pandas as pdpd.set_option(display.max_rows,None) gpd.read_file(gpd.datasets.get_path(naturalearth_lowres)) pop_est人口数量continent国家所在的大陆name国家的名称iso_a3国家的三个字母的…

初识集合框架 -Java

目录 一、集合框架的概念 二、集合框架的重要性 三、涉及的数据结构和算法 3.1 什么是数据结构 3.2 集合框架(容器)背后对应的数据结构 3.3 相关的Java知识 3.4 什么是算法 3.5 如何学好数据结构和算法 一、集合框架的概念 Java 集合框架,…

山寨能走多远?盗版还是盗火?KCC@深圳活动圆满举办

2023.8.19 ,我们组织了一场大家期待已久的线下活动: KCC深圳:Kickoff & 读书会Meetup 来了深圳都是深圳人,没有哪座城市能够像深圳代表中国改革开放的发展历程,年轻、上进、有活力、拥抱新事物,同样&am…

脚本:python实现动态爱心

文章目录 效果代码Reference python实现dynamic heart 效果 代码 import turtle as tu import random as ratu.setup(0.5, 0.5) # 设置画板大小(小数表示比例,整数表示大小) tu.screensize(1.0, 1.0) # 设置屏幕大小 tu.bgcolor(black) #…

系统架构设计师(第二版)学习笔记----多媒体技术

【原文链接】系统架构设计师(第二版)学习笔记----多媒体技术 文章目录 一、多媒体概述1.1 媒体的分类1.2 多媒体的特征1.3 多媒体系统的基本组成 二、多媒体系统的关键技术2.1 多媒体系统的关键技术2.2 视频技术的内容2.3 音频技术的内容2.4 数据压缩算法…

2023挖漏洞给报酬的网站汇总,兼职副业3天收益2000

一、众测平台(国内)二、前沿漏洞研究奖励计划三、行业SRC四、企业应急响应中心-SRC-汇总 1、互联网企业2、生活服务、住宿、购物相关企业3、物流、出行、旅游4、金融相关企业5、视频游戏直播社交娱乐6、教育、问答、知识付费7、泛科技通讯物联网云服务8、安全企业9、其他 一、…

java中log使用总结

目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3…

Linux中安装MySQL5.7.42

1. 首先,下载mysql5.7.42的安装包(下方是下载地址),选择红色框框的下载(注意的是,这个链接只提供5.7的版本下载,可能还会更新,不一定打开就是5.7.42的版本,后续可能会有4…