目录

总线错误

1、不存在的地址:

2、未对齐访问

3、对私有外设总线(PPB)的非特权访问和默认的存储器访问权限相冲突

存储管理错误

使用错误

HardFault

参考资料


总线错误

维基的解释为:

In computing, a bus error is a fault raised by hardware, notifying an operating system (OS) that a process is trying to access memory that the CPU cannot physically address: an invalid address for the address bus, hence the name. In modern use on most architectures these are much rarer than segmentation faults, which occur primarily due to memory access violations: problems in the logical address or permissions.[2]

在计算机领域,总线错误是一种由硬件生成的错误,用来告知操作系统,有一个程序正试图访问CPU从物理层面无法访问的内存,即一个对于地址总线来说的无效地址。从大多数当代CPU架构的使用情况来看,总线错误比(存储器区)段错误多得多,后者主要是由于 内存的非法访问(逻辑地址或访问权限问题)引起的。

维基说的总线错误不常见,是针对有已经有完善驱动的操作系统来说的。对于单片机,感觉还是比较常见的。

Cortex-M7用户手册的解释为:(注:个人认为只解释的表象

A BusFault is an exception that occurs because of a memory related fault for an instruction or data memory transaction. This might be from an error detected on a bus in the memory system.

1、不存在的地址:

软件指示CPU去读/写一个具体的物理内存地址。相应地,CPU将这个物理地址写入地址总线,并要求所有有响应这个特定地址的其他硬件设备传回结果。如何没有其他硬件设备响应,则CPU将产生一个异常,声明整个计算机系统无法识别请求的物理地址。

知道内在机理后,“地址不存在”直接取决于其他硬件设备的响应,于是可以解释为以下3总情况:

a\地址真的不存在:

架构上分配的空间,下图所示[3]:

但实际使用的就少的说,可参见STM32H7编程手册“Table 7. Memory map and default device memory area attributes”,以及具体型号所拥有的内存。如表中写的"Reserved"地址就是真正不存在的地址了。

b\设备未准备好接受某传输。

void SystemInit (void){   ...#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)SystemInit_ExtMemCtl();#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */...}

如固件库中,若未对片外RAM进行初始化就读写片外RAM。

c\收到传输请求的总线从设备返回一个错误响应。

例如,若总线从设备不支持传输的类型/大小或者外设不允许正在执行的操作,就会出现这种情况。

2、未对齐访问

如sprintf等函数的dest参数必须4字节对齐。否则会产生错误。例子参见[6]

3、对私有外设总线(PPB)的非特权访问和默认的存储器访问权限相冲突

注:SCB的权限未提及,不太清楚。“3”是cortexM特有的,看上去不是很符合总线错误定义中“物理”这一特性,反倒点像段错误,原因未知。

存储管理错误

In computing, a segmentation fault (often shortened to segfault) or access violation is a fault, or failure condition, raised by hardware with memory protection, notifying an operating system (OS) the software has attempted to access a restricted area of memory (a memory access violation). On standard x86 computers, this is a form of general protection fault. The OS kernel will, in response, usually perform some corrective action, generally passing the fault on to the offending process by sending the process a signal. Processes can in some cases install a custom signal handler, allowing them to recover on their own, but otherwise the OS default signal handler is used, generally causing abnormal termination of the process (a program crash), and sometimes a core dump.[4]

在计算机领域,段错误或者说非法访问是由一种具有内存保护机制的硬件产生的错误或情况。它用来告知操作系统有软件尝试访问一个被限制的内存区域,即进行内存非法访问。在标准的x86计算机下,这是一种一般保护错误。作为响应,OS内核通常会执行一些纠正操作,普遍是通过向违规进程发送信号的方式将错误传递给违规进程。 在某些情况下,进程可以安装自定义信号句柄,允许它们自行恢复,但在其他情况下将使用OS默认信号处理程序,这通常会导致进程异常终止(程序崩溃),有时还会导致核心转储

Cortex-M7用户手册的解释为:

A MemManage fault is an exception that occurs because of a memory protection related fault. The fixed memory protection constraints, or the MPU if implemented, determines this fault, for both instruction and data memory transactions. This fault is always used to abort instruction accesses to Execute Never (XN) memory regions.

内存的访问是有一定的规则的(亦即权限),一些是CPU设计时已经考虑的,而另一些则是通过MPU来设置的规则。

1、CPU设计时已经考虑的部分:

a\非特权任务试图访问只支持特权访问的存储器区域。

b\在PERIPHERAL、DEVICE或SYSTEM等永不执行(XN)区域执行程序代码

2、MPU可设置的规则:

a\访问未在任何MPU区域中定义的存储位置(私有外设总线除外,其总可被特权代码访问)

b\存储器访问和MPU定义的访问权限冲突

从错误发生时程序所在的过程上看:

1、程序执行

2、取出程序期间的数据访问

3、执行过程中的栈操作:又分为压栈错误和出栈错误

使用错误

Cortex-M7用户手册的解释为:

A UsageFault is an exception that occurs because of a fault related to

instruction execution. This includes:

• An undefined instruction.

• An illegal unaligned access.

• Invalid state on instruction execution.

• An error on exception return.

The following can cause a UsageFault when the core is configured to

report them:

• An unaligned address on word and halfword memory access.

• Division by zero.

HardFault

FORCED:出现总线错误、存储错误或使用错误,但对应的异常没有使能,那么将会进入HardFault,并且强制位(FORCED)置位。

VECTOR:该标志位这是由于取中断向量失败引起的。只要是使用官方的启动文件(即“.s”文件),那么引起该错误大概率是中断向量表偏移错误导致。因为若使用官方".s"文件,若忘记定义用户自己的中断服务函数(或者说函数句柄Handler),那么由汇编伪指令[WEAK],中断向量将指向多个标签共用一个汇编函数的位置,并且由于B . 的存在(同C语言中的while(1))。

WWDG_IRQHandler                                                         …;省略部分WAKEUP_PIN_IRQHandlerB       .ENDPALIGN

DEBUGEVT:由调试事件触发,具体可能要了解调试架构才能知道了。

例子

在Keil中可以打开Faullt Reports来查看相关寄存器。若是总线错误,那么可以查看辅助总线寄存器,查看是那条总线引起的,根据该寄存器分析错误原因需要了解一些总线架构的知识。

当错误发生时,分析错误原因的方法可分为两类:栈跟踪和指令跟踪(CPU要有ETM单元,要有支持ETM功能的调试器)。栈跟踪可以参考[5]

参考资料

[1] ARM Cortex-M3 与Cortex-M4权威指南

[2] Bus error https://en.wikipedia.org/wiki/Bus_error

[3] Arm cortex-m4 programmer model Arm cortex-m4 programmer model

[4] Segmentation fault https://en.wikipedia.org/wiki/Segmentation_fault

[5] 如何找到导致程序出现HardFault的代码 https://bbs.21ic.com/icview-1305754-1-1.html

[6] https://blog.csdn.net/u012450329/article/details/53939417

Cortex-M系列:错误异常相关推荐

  1. php 错误 异常,php中的异常和错误解析

    PHP错误是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查甚至无法运行的情况.PHP异常一般是业务逻辑上出现的不合预期.与正常流程不同的状况,不是语法错误.本文介 ...

  2. HTTP网络连接相关知识整理(三):网络错误异常

    一.tcp连接错误 待补充 二.应用层(HTTP)错误异常 HTTP错误主要分成三类:用户设备问题.Web服务器问题和连接问题.当客户端向Web服务器发送一个HTTP请求时,服务器都会返回一个响应代码 ...

  3. 如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M7系列MCU进行SWD接口调试

    该篇幅介绍如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M系列MCU进行SWD接口调试? 如何连接FT2232HL Debuger Adapter和目标板的的SWD调 ...

  4. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  5. python中ioerror怎么解决_Python IOError错误异常原因|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ python语言IOError错误一般多发生在对文件操作报错时,表示要打开的文件不存在,当然能引发IOEr ...

  6. python上一行的代码打错了怎么办_写Python代码过程中碰到各种错误异常要怎么样去处理?...

    错误异常即便Python程序的语法是正确的,在程序运行的过程中,也可能发生错误.运行期检测到的错误被称为异常. 如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因. ...

  7. mysql 远程load data,PyMySQL将(文件)数据加载到远程MySQL实例时发生错误/异常

    我正在使用PyMySQL-0.5.0并在将数据从文件加载到远程MySQL实例时遇到了一个模糊的错误/异常.在执行"loaddatalocalinfile-"语句时,我看到一个异常, ...

  8. php js 报错信息,JavaScript中错误异常的分析(附示例)

    本篇文章给大家带来的内容是关于JavaScript中错误异常的分析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我的建议是不要隐藏错误,勇敢地抛出来.没有人会因为代码出现 ...

  9. Mac下Cornerstone错误异常导致打不开

    Mac下Cornerstone错误异常导致打不开 副标题:SVN客户端异常打不开 一.问题描述: Mac下使用的SVN客户端是Cornerstone,版本2.7.10.破解版. 今日使用的时候,可能更 ...

  10. 【错误异常大全】:正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    文章目录 错误异常: 解决方案一: 解决方案二: 错误异常: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 解决方案 ...

最新文章

  1. mysql 数据库乱码
  2. 【react开发】使用swiper插件,loop:true时产生的问题解决方案
  3. Day 23 面向对象进阶
  4. Redis 哨兵模式 带密码单机
  5. OpenCASCADE:构建配置文件
  6. 归并排序 java 迭代_经典排序算法之归并排序(示例代码)
  7. node环境变量_实际使用Node环境变量的方法如下
  8. 10万美元奖金!CVPR 2021 重磅赛事,安全AI挑战者计划
  9. 八位二进制数码管显示multisim_显示屏基础知识(LED电子显示屏的维修资料(芯片))4...
  10. linq 学习日记-select
  11. Yaksa让你抛弃Adapter和ViewHolder写RecyclerView
  12. eclipse反编译class文件
  13. 计算机课件大学,大学计算机基础应用课件
  14. Tomcat7与Tomcat8的差异详细对比
  15. oracle analyze any,Oracle 工具:Analyze
  16. 如何判断vps的好坏?
  17. 李白藏头诗鸿蒙,女子示爱的诗词
  18. 亲爱的我把孩子放大了文案解说
  19. java dao 是什么_dao java是什么
  20. 如何给电脑安装双系统,电脑安装双系统教程

热门文章

  1. 异或的4种神奇的运用场景
  2. 夜空中最靓的二狗子是如何让 HTTPS 快上加快的?
  3. C语言编程>第十八周 ⑧ 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。
  4. 【设计模式】备忘录模式(以电影明日边缘为例)
  5. 一个MMORPG游戏的常规技能系统
  6. Tensorflow2.x 利用“GradientTape 梯度带”自动求梯度
  7. 【C#高级详解】——刘铁猛老师
  8. 一文读懂ZigBee无线通信技术
  9. web前端-综合应用案例-简历表页面的制作-educoder
  10. unity手机端指南针安卓测试有效