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

news2024/10/10 18:22:00

文章目录

    • 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.coloradmin.cn/o/993623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV项目开发实战--实现面部情绪识别对情绪进行识别和分类及详细讲解及完整代码实现

文末提供免费的完整代码下载链接 面部情绪识别(FER)是指根据面部表情对人类情绪进行识别和分类的过程。通过分析面部特征和模式,机器可以对一个人的情绪状态做出有根据的猜测。面部识别的这个子领域是高度跨学科的,借鉴了计算机视觉、机器学习和心理学的见解。 在这篇研究…

C++数据结构 -- AVL树

目录 一、什么是AVL树?AVL树的概念 二、 AVL树的节点的定义三、 AVL树新结点的插入3.1 左单旋左单旋代码实现3.2 右单旋右单旋代码实现3.3 左单旋或者右单旋解决不了的问题3.4 左右双旋左右双旋代码实现3.5 右左双旋右左双旋代码实现 四、代码汇总 一、什么是AVL树&…

【Vue篇】Vue 项目下载、介绍(详细版)

如何创建一个vue项目?首先要有环境,如下: nodejs vue-cli如果有以上的工具就直接跳过安装教程 【Vue篇】mac上Vue 开发环境搭建、运行Vue项目(保姆级) 创建vue项目 选择一个位置,你要存放项目的路径&…

App线上网络问题优化策略

在我们App开发过程中,网络是必不可少的,几乎很难想到有哪些app是不需要网络传输的,所以网络问题一般都是线下难以复现,一旦到了用户手里就会碰到很多疑难杂症,所以对于网络的监控是必不可少的,针对用户常见…

golang flag 包的使用指北

说起 golang 的 flag 个包,我们第一反应的是什么呢?至少我曾经第一次看到 flag 包的时候,第一反应是想起写 C 语言的时候咱们用于定义一个表示的,我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于处理命令行参数的工具…

《深入浅出OCR》第六章:OCR数据集与评价指标

一、OCR技术流程 在介绍OCR数据集开始,我将带领大家和回顾下OCR技术流程,典型的OCR技术pipline如下图所示,其中,文本检测和识别是OCR技术的两个重要核心技术。 1.1 图像预处理: 图像预处理是OCR流程的第一步&#xf…

5147. 数量

题目: 样例1: 输入 4 输出 1 样例2: 输入 7 输出 2 样例3: 输入 77 输出 6 思路: 根据题意,如果直接 for 循环暴力,肯定会超时,但是我们换个思路想,只要包含 4 和 7的…

【2023年数学建模国赛】C题代码与技术文档分享

2023年数学建模国赛C题 第一问代码code1_Q1_1.mCode1_Q1_2.mCode1_Q1_3.m实验结果 技术文档问题分析假设符号说明1 第一问1.1分布检验模型的建立1.2 相关性模型的建立1.3各种类蔬菜的销量分布及相关关系 写在最后 第一问代码 code1_Q1_1.m clc clear Dxlsread(合成表1,合成表…

通过实例学习:使用Spring Cache实现实际场景的缓存策略

文章目录 前言一、Spring Cache 常用注解1.Cacheable:2.CachePut:3.CacheEvict:4.CacheConfig:5.EnableCathing: 二、使用步骤1.引入依赖2.配置3.EnableCaching的使用:4.Cacheable的使用:5.CachePut的使用&…

c语言练习46:模拟实现strncpy

模拟实现strncpy 模拟实现&#xff1a; #include<stdio.h> char* my_strncpy(char*dest,char*src,size_t num) {char* ret dest;size_t i 0;for (i 0; i < num; i) {*dest *src;dest;src;}*dest \0;return ret; } int main() {char aim[50] { 0 };char src[] …

03_kafka-eagle 监控

文章目录 安装修改 kafka-server-start.sh修改 kafka-run-class.sh问题eagle 日志报错mysql 报错 时区问题 kafka-eagle 监控 安装 download.kafka-eagle.org &#xff1a; https://github.com/smartloli/kafka-eagle-bin/archive/v3.0.1.tar.gzhttps://docs.kafka-eagle.org/…

C语言“牵手”lazada商品详情数据方法,lazada商品详情API接口,lazadaAPI申请指南

lazada是东南亚最大的自营式电商企业&#xff0c;在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 lazada平台的商…

C基础-数组

1.一维数组的创建和初始化 int main() {// int arr1[10];int n 0;scanf("%d",&n);//int count 10;int arr2[n]; //局部的变量&#xff0c;这些局部的变量或者数组是存放在栈区的&#xff0c;存放在栈区上的数组&#xff0c;如果不初始化的话&#xff0c;默认…

heap堆结构以及堆排序

堆的定义 堆&#xff08;heap&#xff09;是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质&#xff1a; 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; 堆总是一棵完全二叉树。 将根结点最大的堆叫做…

YOLO目标检测——复杂场景人员行人数据集+已标注voc格式标签下载分享

实际项目应用&#xff1a;安防监控、人群管理、自动驾驶、城市规划、人机交互等等数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;分为训练集和验证集。标注说明&#xff1a;使用…

kubernetes(K8S)笔记

文章目录 大佬博客简介K8SDocker VS DockerDockerK8S简介K8S配合docker相比较单纯使用docker 大佬博客 Kubernetes&#xff08;通常缩写为K8s&#xff09;是一个用于自动化容器化应用程序部署、管理和扩展的开源容器编排平台。它的构造非常复杂&#xff0c;由多个核心组件和附加…

【Java基础篇 | 类和对象】--- 聊聊什么是内部类

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言 当一个事物的内部&…

分享日常电脑遇到msvcr110.dll丢失的解决方法

最近&#xff0c;我在尝试运行一款新的软件时&#xff0c;突然遇到了一个错误提示&#xff0c;提示说缺少msvcr110.dll文件&#xff0c;导致软件无法启动。在使用电脑过程中&#xff0c;我们常常会遇到一些系统文件丢失的问题。其中&#xff0c;msvcr110.dll是Windows操作系统中…

10分钟从实现和使用场景聊聊并发包下的阻塞队列

上篇文章12分钟从Executor自顶向下彻底搞懂线程池中我们聊到线程池&#xff0c;而线程池中包含阻塞队列 这篇文章我们主要聊聊并发包下的阻塞队列 阻塞队列 什么是队列&#xff1f; 队列的实现可以是数组、也可以是链表&#xff0c;可以实现先进先出的顺序队列&#xff0c;…

【矩阵分解】PCA - 主成分分析中的数学原理

前言 本文主要对PCA主成分分析中的数学原理进行介绍&#xff0c;将不涉及或很少涉及代码实现或应用&#xff0c;阅读前请确保已了解基本的机器学习相关知识。 文章概述 PCA主成分分析属于矩阵分解算法中的入门算法&#xff0c;通过分解特征矩阵来实现降维。 本文主要内容&a…