0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Cortex-M0处理器内核异常中断简介

安芯教育科技 来源:技术社区 作者:技术社区 2022-06-01 14:41 次阅读
1. Cortex-M0 处理器内核异常中断简介

在Cortex‐M0内核上搭载了一个异常响应系统,支持众多的系统异常和外部中断。其中,编号为1-15的对应系统异常,大于等于16的则全是外部中断,优先级的数值越小,则优先级越高。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。

因为芯片设计可以修改内核的硬件描述源代码,所以做成芯片后,支持的中断源数目常常不到240 个,并且优先级的位数也由芯片厂商最终决定。

e58c9a92-e168-11ec-ba43-dac502259ad0.png

类型编号为 1-15 对应系统异常,在《ARM Cortex-M0权威指南》一书中的第12章节<错误处理>章节中有描述:对于ARM处理器,架构采用错误异常的机制来检测问题,当一个程序产生了错误并且被处理器检测到时,异常中断会被触发,并且核心会跳转到相应的异常终端处理函数执行,错误异常的中断有如下:

Reset


在上下电、NRST拉低、看门狗复位或软复位时启动复位。当复位产生时,处理器停止一切操作,并将复位当做一种特殊形式的异常来执行,进入到对应的中断函数。当复位撤销时,从向量表中复位项提供的地址处重新启动执行,芯片重新开始执行。

NMI


不可屏蔽中断(NMI),可以由外设产生,也可以由软件来触发。这是除复位之外优先级最高的异常中断,NMI永远使能,优先级固定为-2,CSS的时钟安全机制使能判定时钟失效后就会进入到该中断。NMI 不能:


1、被屏蔽,它的执行也不能被其他任何异常中止;
2、被除复位之外的任何异常抢占。

HardFault


HardFault 是由于在正常操作过程中或在异常处理过程中出现错误而出现的一个异常。HardFault的优先级固定为-1,表明它的优先级要高于任何优先级可配置的异常。

SVCall


管理程序调用(SVC)异常是一个由SVC指令触发的异常。在OS环境下,应用程序可以使用 SVC指令来访问OS内核函数和器件驱动。

PendSV


PendSV是一个中断驱动的系统级服务请求。在OS环境下,当没有其它异常有效时,使用 PendSV 来进行任务切换。

SysTick


SysTick是一个系统定时器到达零时产生的异常,软件也可以产生一个SysTick异常。在OS环境下,处理器可以将这个异常用作系统节拍。

中断(IRQ)


中断(或 IRQ)是外设发出的一个异常,或者由软件请求产生的一个异常。在系统中,外设使用中断来与处理器通信,在中断函数中可以查询和清除标志操作。

2. HardFault异常

HardFault (硬件错误,也有译为硬错误)是在MCU上编写程序中所产生的错误,硬件错误处理几乎是最高优先级,它的优先级为-1,只有复位和不可屏蔽中断(NMI)可以对其进行抢占。当它发生时,表示处理器出现了问题,需要采取紧急修复措施。

造成HardFault错误的可能原因较多,如何在代码量较大的情况下,快速定位造成的HardFault的问题代码,就成为比较关键的问题。

本文将以MM32F0130系列MCU为例,Keil-MDK开发环境,总结HardFault的调试、定位方法。在其它Cortex-M0 (M3,M4)内核处理器,和其它开发环境下,也可作为参考。

2.1 可能的原因

《ARM Cortex-M0权威指南》中提到,关于 Cortex M0内核主要有以下几点引起HardFault的原因:

  • 非法存储器访问

  • 非对齐数据访问

  • 从总线返回错误

  • 异常处理中的栈被破坏

  • 程序在某些 C 函数中崩溃

  • 意外地试图切换至 ARM 状态

  • 在错误的优先级上执行系统服务调用指令(SVC)

从软件角度,产生HardFault的可能原因有:
  • 数组越界

  • 野指针

  • 未初始化硬件却开始操作,或无中断服务函数等

  • 任务堆栈溢出

  • 中断服务函数设置错误

  • 时钟异常

注意:只有复位和NMI可以抢占优先级固定的 HardFault 处理程序。HardFault可以抢占除复位、NMI 或其它硬故障之外的任何异常。
2.2 可能出现的异常
如果在执行NMI或HardFault处理程序时,或者在一个使用MSP的异常返回时出栈的却是PSR的时候系统产生一个总线错误,处理器进入一个锁定状态。当处理器处于锁定状态时,它不执行任何指令。处理器保持处于锁定状态,直到下面任何一种情况出现:
  • 出现复位

  • 调试器将锁定状态终止,出现中止仿真的现象

  • 出现一个NMI,以及当前的锁定处于HardFault处理程序中

注意:如果锁定状态出现在NMI处理程序中,后面的NMI就无法使处理器离开锁定状态。 在应用程序中,处理器处于锁定状态,会一直在void HardFault\_Handler(void)函数中执行。
voidHardFault_Handler(void)
{/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/
while(1)
{
}
}

下面将在MM32F0130上运行的数组越界代码为例,具体阐述定位步骤:

voidStackTest(void)
{intdata[3],i;
for(i=0;i<10000; i++)
    {
    data[i]=1;
    }
}
3. 查找HardFault方法和步骤

实际环境中,由于测试高压产品常常无法连接调试器,故需要代码来定位目标语句地址,并通过一定手段保存:

在MM32F0130中,需先修改启动文件startup\_mm32f013x.s:

HardFault_Handler
PROC
IMPORThard_fault_handler_c;函数声明
MOVSr0,#4;判断主栈指针还是进程栈指针
MOVr1,LR
TSTr0,r1
BEQstacking_used_MSP;如果是主栈指针
MRSR0,PSP;否则是进程栈指针,把进程栈指针地址付给R0
Bget_LR_and_branch;跳转到HardFault中断程序
stacking_used_MSP
MRSR0,MSP;把主栈指针地址赋给R0
get_LR_and_branch
MOVR1,LR

BLhard_fault_handler_c
ENDP

该段代码会判断当前堆栈使用的是MSP或PSP,然后将堆栈参数传递给hard\_fault\_handler\_c函数,该函数定义如下:

voidhard_fault_handler_c(unsignedint*hardfault_args,unsignedlr_value)
{unsignedintstacked_r0;//压栈的r0
unsignedintstacked_r1;//压栈的r1
unsignedintstacked_r2;//压栈的r2
unsignedintstacked_r3;//压栈的r3
unsignedintstacked_r12;//压栈的r12
unsignedintstacked_lr;//压栈的lr
unsignedintstacked_pc;//压栈的pc
unsignedintstacked_psr;//压栈的psr

stacked_r0=((unsignedint)hardfault_args[0]);
stacked_r1=((unsignedint)hardfault_args[1]);
stacked_r2=((unsignedint)hardfault_args[2]);
stacked_r3=((unsignedint)hardfault_args[3]);
stacked_r12=((unsignedint)hardfault_args[4]);
stacked_lr=((unsignedint)hardfault_args[5]);
stacked_pc=((unsignedint)hardfault_args[6]);
stacked_psr=((unsignedint)hardfault_args[7]);

while(1)
{
printf("[Hardfaulthandler]
");
printf("R0=%x
",stacked_r0);
printf("R1=%x
",stacked_r1);
printf("R2=%x
",stacked_r2);
printf("R3=%x
",stacked_r3);
printf("R12=%x
",stacked_r12);
printf("StackedLR=%x
",stacked_lr);
printf("StackedPC=%x
",stacked_pc);
printf("StackedPSR=%x
",stacked_psr);
printf("SCB_SHCSR=%x
",SCB->SHCSR);
printf("CurrentLR=%x
",lr_value);
}
}

处理器进入到HardFault,将R0~R3、R12、LR、PC信息通过串口打印,根据寄存器信息排查问题代码。

当处理器处理异常时,除非异常是一个末尾连锁异常或迟来的异常,否则,处理器把信息都压入到当前堆栈中入栈(stacking),8个数据字的结构被称为栈帧(stack frame),栈按照双字地址对齐方式。

e6090e4c-e168-11ec-ba43-dac502259ad0.png

入栈后,堆栈指针立刻指向栈帧的最低地址单元。栈包含返回地址,这是被中止的程序中下条指令的地址。这个值在异常返回时返还给 PC,使被中止的程序恢复执行。

如下图连接仿真器查看汇编的地址可以找到是程序问题,根据PC指针地址,在程序生成的.map中查找出问题函数。

e6390cbe-e168-11ec-ba43-dac502259ad0.png

4. 处理建议

根据上述的定位手段可以查找是哪一种情况造成的异常,在编程过程中需要避免出现上述异常情况,但是在恶劣复杂的环境下,可能会小概率触发HardFault中断,可以在函数中添加复位或者跳转指令,具体的实现方式需根据应用和使用环境来评估。

原文标题:HardFault定位方法和步骤

文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18261

    浏览量

    222116
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41022
  • Cortex-M0
    +关注

    关注

    4

    文章

    122

    浏览量

    38353

原文标题:HardFault定位方法和步骤

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM Cortex-M0权威指南(英文版)

    , 153, 153) !important]2016-2-3 13:41 上传本书是全球首本系统论述ARM Cortex-M0处理器及其编程的图书。本书既有ARM Cortex-M0处理器
    发表于 10-08 16:46

    ARM异常中断处理流程分析

    = 0x0000001C从异常中断处理程序中返回包括下面两个基本操作:恢复被中断的程序的处理器状态,即将SPSR_mode寄存
    发表于 08-28 08:09

    如何选择正确的Cortex-M处理器

    4和Cortex-M7处理器应用在许多高性能的微控制产品中,最大的时钟频率可以达到400Mhz。当然,性能不是选择处理器的唯一指标。在许多应用中,低功耗和成本是关键的选择指标。因此,
    发表于 10-22 08:16

    Cortex-M0处理器的基础知识

    Cortex-M0处理器介绍
    发表于 02-26 06:03

    Cortex-M3处理器是什么

    STM32单片机STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器
    发表于 07-16 06:33

    cortex-m系列正式发布的版本是

    cortex-m系列正式发布的版本是,一 Cortex-M0Cortex-M0+TODO: ARM处理器家族Cortex-M0
    发表于 07-22 09:54

    灵动微课堂 (第176讲) | Cortex-M0中断控制和系统控制(二)

    开始时完成的。arm官方资料提示应该避免在中断使能之后改变中断优先级,因为这种情况的结果在ARMv6-M系统结构是不可预知的,并且不被Cortex-M0
    发表于 07-29 18:49

    STM32的核心Cortex-M3处理器是什么

    STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CP
    发表于 08-02 08:52

    Cortex™-M3处理器

    2.1STM32F103xx增强型LQFP48引脚分布2.2 STM32F103xx概述2.2.1ARM®的Cortex™-M3核心并内嵌闪存和SRAMARM的Cortex™-M3
    发表于 08-11 07:03

    Cortex-M3处理器中的嵌套向量中断控制器的特性是什么?

    中断异常的作用是什么?Cortex-M3处理器中的嵌套向量中断控制器的特性是什么?
    发表于 11-05 07:25

    STM32的核心Cortex-M3处理器的标准化是什么意思

    STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CP
    发表于 12-06 07:53

    中断事件的异常处理是什么意思

    M0内核支持的资源Cortex-M0处理器最多支持32个外部中断(通常称作IRQ),还有一个被称作不可屏蔽
    发表于 12-21 06:50

    制造一种基于Cortex-M0Cortex-M3处理器的SoC

    DesignStartDesignStart计划可以让用户无需预付授权费用,就可以开始设计、制造基于Cortex-M0Cortex-M3处理器的SoC,当产品成功量产出货之后再支付版税。ARM
    发表于 07-27 16:58

    ARM Cortex-M0设计启动评估用户指南

    Cortex-M0 DesignStart Eval为开发人员提供了一种简单的方法来模拟基于Cortex-M0处理器的SoC设计。 它允许系统设计人员在模拟上进行设计和测试,然后使用
    发表于 08-18 07:58

    当ARM异常中断发生时的处理措施

    外部中断请求(IRQ) 当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。系统中个外设
    的头像 发表于 08-27 14:21 2378次阅读