指令集方面:arm一般高端处理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端处理器,也叫做单片机,为了增加代码密度(同样存储器内可以存更多指令),用的是thumb指令集(而且仅支持这个指令集),这个指令集大多数指令是16位的,少数是32位的。这就是为什么上面的调试图中,看到指令都是两个字节,而有的是4个字节。比较老的arm7,arm9等处理器,支持thumb指令和arm指令,需要通过指令告诉处理器,显式的进行指令转换,这个因此需要编译器提供支持。
注意:stm32f1(cortex-m3内核)单片机,仅支持thumb指令,在blx rx跳转指令执行时,会坚持rx寄存器存的地址,的最低为是不是1,如果不是,那么stm32会认为我们企图切换到arm指令,但是arm指令stm32不支持,因此会跳入hardfault硬件错误中断。stm32进入硬件错误中断时候,会在相应的状态指示寄存器里置为,用来提醒用户,是什么问题导致的错误。
只有三种错误类型,但是都会进入产生硬件错误中断。
HardFault错误
这个会在SCB->HFSR寄存器中通过位来标识产生的是什么错误,我们可以在进入了硬件错误中断,查看该寄存器的位来知道发生的是什么错误类型。具体哪位是干嘛的,自己查查Cortex-m3与m4权威指南这本书,讲得真心不错。
1. MemManage错误:存储器管理错误
存储器访问越权,写入MPU保护的只读区域,压栈错误等等。
会在SCB->CFSR寄存器第一个字节显示
2.Bus总线错误
比如访问了非法的存储器位置等。
会在SCB->CFSR寄存器第二个字节显示
3.Usage使用错误
比如非对齐访问,试图切换到arm指令状态等,我上面说的就是这个错误。
会在SCB->CFSR寄存器高半字显示
如果我们在keil mdk中进行调试,可以在HardFault函数处打断点,进入后,菜单栏选择Peripherals -> Core Peripherals -> Fault reportes窗口,看到各个错误寄存器的可视化信息显示,如下图:我这个错误就是由于rx = 20007800, blx rx, 地址rx中的地址最低为不为1,因此出现了使用错误,这个位表示我试图切换到arm指令,因此产生了错误。
文章来源:https://www.toymoban.com/news/detail-407370.html
文章来源地址https://www.toymoban.com/news/detail-407370.html
到了这里,关于stm32进入硬件错误中断hardfault的原因剖析以及如何定位(必看)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!