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

    文章

    19155

    浏览量

    229040
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41384
  • Cortex-M0
    +关注

    关注

    4

    文章

    124

    浏览量

    38633

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

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

收藏 人收藏

    评论

    相关推荐

    采用ARM Cortex-M0处理器内核 英飞凌XMC1302马达控制解决方案

    XMC1300器件是基于XMC 1000系列微控制的成员,采用ARM Cortex-M0处理器内核。 XMC1300系列解决了控制需要电机控制,数字电源转换的实时性问题。它还具有外设
    发表于 08-04 09:42 9493次阅读
    采用ARM <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b><b class='flag-5'>内核</b>  英飞凌XMC1302马达控制解决方案

    Cortex-M0处理器的基础知识

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

    Cortex-M3处理器是什么

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

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

    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处理器内核LPC1100系列微控制

      恩智浦推出了基于32位ARM Cortex-M0处理器内核的LPC1100系列微控制。该处理器是ARM公司
    发表于 08-31 09:09 3481次阅读
    ARM <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b><b class='flag-5'>内核</b>LPC1100系列微控制

    基于ARM Cortex-M0处理器的LPC1200工业控制系列

    恩智浦半导体NXP Semiconductors N.V.今天宣布推出其基于ARM Cortex-M0处理器的LPC1200工业控制系列。LPC1200进一步拓展了恩智浦32位ARM微控制的产品范围,适用于工业和家庭自动化领域
    发表于 02-24 10:00 1307次阅读

    ARM为主流嵌入式SoC设计提供免费的Cortex-M0处理器IP

    ARM公司今天宣布,将为采用ARM Cortex-M0处理器进行商业化之前的SoC元件的设计、原型建模和制造的设计人员提供免费的Cortex-M0处理器IP,以及低成本的FPGA原型建
    发表于 10-15 13:57 2622次阅读

    ARM异常中断的原因及处理措施

    当ARM异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序执行。当异常中断处理
    的头像 发表于 06-17 10:05 8010次阅读

    Cortex-M0处理器的存储模型资料下载

    电子发烧友网为你提供Cortex-M0处理器的存储模型资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-08 08:40 10次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b>的存储模型资料下载

    Cortex-M0处理器异常处理模型资料下载

    电子发烧友网为你提供Cortex-M0处理器异常处理模型资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可
    发表于 04-08 08:41 15次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b>的<b class='flag-5'>异常</b><b class='flag-5'>处理</b>模型资料下载

    Cortex-M0处理器的故障处理和功耗管理资料下载

    电子发烧友网为你提供Cortex-M0处理器的故障处理和功耗管理资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-08 08:42 4次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b>的故障<b class='flag-5'>处理</b>和功耗管理资料下载

    Cortex-M0处理器的编程模型资料下载

    电子发烧友网为你提供Cortex-M0处理器的编程模型资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-11 08:42 12次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b>的编程模型资料下载

    Cortex-M0处理器及其特性资料下载

    电子发烧友网为你提供Cortex-M0处理器及其特性资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-13 08:47 15次下载
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>处理器</b>及其特性资料下载

    Cortex-M0处理器中断请求形式:电平触发和脉冲输入

    Cortex-M0处理器允许两种形式的中断请求:电平触发和脉冲输入。
    的头像 发表于 05-13 12:05 1650次阅读