ARM Cortex-M3处理器故障的分析与处理

时间:2022-06-29 06:06:56

ARM Cortex-M3处理器故障的分析与处理

【摘要】本文介绍了ARM Cortex-M3处理器的4种故障:总线故障、用法故障、内存管理故障和硬故障。分析了这些故障产生的原因,叙述了如何通过故障状态寄存器找出故障原因,如何在程序开发阶段尽可能的避免故障的产生,以及故障的处理方法。

【关键词】ARM;故障;寄存器;中断

1.引言

在嵌入式领域,ARM Cortex -M3处理器凭借其高性能、低功耗、低成本等优势,得到了广泛的应用。该处理器具有很强的灵活性,在给开发人员较大开发空间的同时,也在一定程度上增加了开发的难度。尤其是当处理器出现故障时,故障原因常常难以找出。本文针对该处理器的以上特点,详细分析了处理器的4种故障,使读者可以对故障进行准确的分析和处理。

2.故障分析

ARM Cortex-M3处理器[1]共有4种故障:总线故障、用法故障、内存管理故障和硬故障。ARM将故障当作特殊的中断来处理,其中,硬故障在所有故障中拥有最高优先级,优先级为-1,其它故障的优先级是可整定的,但必须为非负数,默认优先级是0(ARM中优先级的数值越小,优先级的级别越高,负数拥有最高优先级[2])。总线故障是指指令或数据在AHB总线上传输时出现错误而产生的一种故障,可在指令读取、数据读写以及堆栈的压栈和弹栈时产生。用法故障是指在对CPU的使用上出现错误而导致的故障。内存管理故障是指对内存的读写违反了MPU(内存保护单元)的规定或在不允许执行指令的地址执行指令而产生的一种故障。硬故障一般由其它故障升级导致。下面将对每种故障进行详细分析。

2.1 总线故障

总线故障产生的原因有以下几种:读写错误的内存地址(如对一处内存地址进行读写,但该地址并没有连接内存);对一个设备进行读写,但该设备还没有准备好接受读写操作(如读写外部RAM,但外部RAM还没有初始化);对设备读写的数据类型不符合设备的要求(如某设备只支持32位读写,当对该设备进行8位读写时,便会出现故障);设备由于某种原因无法接受对它的读写操作[3](如在非特权模式下对一个只接受特权模式操作的设备进行读写)。如果想使能总线故障处理,将SCB(系统控制模块)中SHCSR寄存器中的BUSFAULTENA位置1。如果将中断向量表放入RAM中,在置位之前应先确定总线故障处理程序的的初始地址已经在表中设置完毕。总线故障发生后,SCB中的BFSR寄存器提供了关于故障的相关信息,如表1所示:

如果BFARVALID位置1,则SCB中BFAR寄存器中的值便代表了产生总线故障所进行读写操作的内存地址。当总线故障产生时,如果故障处理使能,且此时没有相同或更高优先级的中断在运行,总线故障的处理程序将被执行。如果故障处理使能,但此时有相同或更高优先级的中断正在运行,总线故障将处于等待状态。如果故障处理未使能,或故障出现在相同或更高优先级的中断程序中,则总线故障的处理程序无法被执行,于是总线故障升级为硬故障。

2.2 用法故障

用法故障产生的原因有以下几种:使用未定义的指令;使用协处理器指令(Cortex-M3不支持协处理器);试图从Thumb状态转换到ARM状态;中断返回值错误(LR寄存器中含有错误的返回值);在使用STM或LDM指令时,内存地址未对齐;除以0或读写未对齐的内存地址(可通过对NVIC——可嵌套向量中断控制器相应寄存器的控制位选择是否产生故障)。如果想使能用法故障处理,将SCB中SHCSR寄存器中的USGFAULTENA位置1。如果将中断向量表放入RAM中,在置位之前先确定用法故障处理程序的的初始地址已经在表中设置完毕。用法故障发生后,SCB中的UFSR寄存器提供了关于故障的相关信息,如表2所示:

与总线故障相同,当用法故障产生时,如果故障处理使能,则在没有相同或更高优先级中断运行时,用法故障处理程序被执行,否则处于等待状态。如果故障处理未使能,或故障出现在相同或更高优先级的中断程序中,则升级为硬故障。

2.3 内存管理故障

内存管理故障产生的原因有以下几种:所读写的内存地址超出了MPU的设置范围;对只读区域进行写操作;在非特权状态下对只支持特权读写的区域(由MPU规定)进行读写操作。如果想使能内存管理故障处理,将SCB中SHCSR寄存器中的MEMFAULTENA位置1。如果将中断向量表放入RAM中,在置位之前应先确定内存管理故障处理程序的的初始地址已经在表中设置完毕。内存管理故障发生后,SCB中的MMSR寄存器提供了关于故障的相关信息,如表3所示:

如果MMARVALID位置1,则SCB中MMAR寄存器中的值便代表了产生内存管理故障所进行读写操作的内存地址。与总线故障相同,当内存管理故障产生时,如果故障处理使能,则在没有相同或更高优先级中断运行时,内存管理故障处理程序被执行,否则处于等待状态。如果故障处理未使能,或故障出现在相同或更高优先级的中断程序中,则升级为硬故障。

2.4 硬故障和系统锁定

硬故障是一种比较特殊的故障,它一般在出现了上述故障,而由于某种原因上述故障的处理程序无法执行,或在故障处理程序中又产生了故障,或出现了某种用其它方式无法解决的故障时产生。当产生中断,对中断向量表中的向量进行读取时,如果出现了总线故障,或中断向量表中的向量不正确,硬故障也会产生。硬故障还可由调试引起。硬故障产生后,SCB中的HFSR寄存器提供了关于故障的相关信息,如表4所示:

当在硬故障或NMI(不可屏蔽中断,优先级为-2)的处理程序中产生了故障,或在重启后对SP、PC的读取中出现总线故障,系统会进入锁定状态。如果程序在一开始就不运行,可能是中断向量表被放在了错误的内存地址中,或向量的0位没有置1。如果程序运行一些指令后突然崩溃,则有可能是由于大端小端的设置出错或堆栈指针设置得不正确。

3.故障处理

在程序开发过程中和现场运行中对故障处理有着不同的要求。在程序开发过程中主要是找出产生故障的原因,使开发人员及时修正。而在现场运行中主要是使系统恢复到正常的工作状态[4]。

在程序开发过程中,为了尽量避免故障的产生,应将堆栈空间设置得足够大,如果使用操作系统,则应保证每个任务的堆栈都有足够的空间,以避免程序中出现错误改变堆栈中的数据。如果软件系统比较简单,可以在故障处理程序中报告相关的故障信息,如果软件系统比较复杂,则应将故障信息存储在内存中的某个位置,然后使用PendSV来报告故障信息。

故障处理程序应尽可能的简单,以避免在故障处理程序中产生新的故障。在故障的处理程序中应尽可能的避免不必要的压栈操作,在必要的压栈操作之前可以先检查堆栈指针是否正确,如果堆栈指针正确,再进行压栈操作。在硬故障和NMI处理程序中最好只使用R0-R3寄存器,以及R12寄存器,以避免在硬故障和NMI处理程序中进行压栈操作而产生总线故障使程序进入锁定状态。

需要报告的故障信息包括以下几种:

(1)故障状态寄存器:BFSR、UFSR、MMSR、HFSR、DFSR和AFSR。根据芯片制造商的不同实施方案,AFSR寄存器可能并不存在,此时可不考虑该寄存器。

(2)堆栈中的数据:被压栈的PC、LR、PSR寄存器以及R0-R3、R12寄存器的值。在读取堆栈中的数据之前,应先通过LR寄存器中的bit[2]确定产生故障的程序所用的堆栈是MSP还是PSP。

(3)故障地址寄存器:BFAR和MMAR。对故障地址寄存器操作时,应按以下步骤进行:首先,读取BFAR/MMAR寄存器,而后读取BFSR/MMSR中的BFARVALID/MMARVALID位,如果上述位为0,则说明故障地址寄存器中的值不准确,将其丢弃,最后,清除BFARVALID/MMARVALID位。若不按上述步骤进行,而先读取FARVALID/MMARVALID位后读取故障地址寄存器,则如果在这两次操作之间,执行了优先级更高的故障处理程序,故障地址寄存器中的值可能被改动,当程序返回到原始的故障处理程序后,会误以为故障地址寄存器中的值没有变化而产生误判。

现场运行中对故障处理的常用的方法有以下几种:

1)关闭任务:如果使用了操作系统,可以关闭产生故障的任务,并在需要的时候重新启动该任务。

2)修复:在某些情况下,产生的故障可以被修复(如执行从处理器指令后,可以在用法故障中用软件模拟从处理器)。

3)重启:在非操作系统环境下,这是最常用的方法。将SCB中AIRCR寄存器中的SYSRESETREQ位置1,从而将整个系统重启。如果系统进入了锁定状态,PC寄存器中的值将固定为0xFFFFFFFX,并将从这一地址反复读取指令,此时Cortex-M3核心将会输出一个LOCKUP信号,芯片制造商可以根据这个信号触发中断。如果芯片制造商对LOCKUP信号未作处理,也可通过设置独立看门狗将系统重启。

4.结语

本文详细的分析了ARM Cortex-M3处理器的4种故障——总线故障、用法故障、内存管理故障和硬故障的产生原因、特点及查找方法,并叙述了在程序开发过程中和现场运行中故障处理的方法。

参考文献

[1]Cortex-M3 Technical Reference Manual. /help/topic/com.arm.doc.ddi0337i/DDI0337I_cortexm3_r2p1_trm.pdf

[2]Cortex-M3 Embedded Software Development. /help/topic/com.arm.doc.dai0179b/AppsNote179.pdf

[3]Cortex-M3 Devices Generic User Guide. /help/topic/com.arm.doc.dui0552a/DUI0552A_cortex_m3_dgug.pdf

[4]Joseph Yiu. The Definite Guide to the ARM Cortex-M3. Elsevier Inc.

作者简介:孙洪蛟(1984—),男,大学本科,助理工程师,现供职于阿城继电器股份有限公司,主要从事基于ARM Cortex-M3处理器的嵌入式软件平台的研发工作。

上一篇:浅谈职业教育教学模式创新 下一篇:《汽车电路与电子系统检修》课程教学改革与实...