STM32F407进入HardFault解决办法小结一点点

UCOSII 调试掉进HardFault_Handler,解决与定位方法

故障可能会有以下几种:

1、ucos分配的堆栈太小了,优先级次序

2、数组溢出

3、非法的指针 ,比如空指针 ,编译对的

4、OS_ENTER_CRITICAL()没有配套使用

5.在UCOSII系统中必须中断中配套使用OSINTENTER(),与OSINTExit();

定位办法为:

1、首先在HardFault_Handler的while(1)处打上断点。

2、等待代码运行到此,这时查看寄存器LR,在左边一个是工程,一个是寄存器。

下面面的LR是我正常时copy的,一般在进入hardfault时,会变成下图的值,这时就可以知道该看那个寄存器的值,当时我那里是0xFFFFFFFD,所以是看PSP的地址。

STM32F407进入HardFault解决办法小结一点点

STM32F407进入HardFault解决办法小结一点点

3、找到该看的地址后然后如下图打开内存,输入上面找到的寄存器的地址,在右键选择以long型查看地址,如下图。

STM32F407进入HardFault解决办法小结一点点

然后查看这个地址,向下面数6个long地址,大概是0x08xxxxx这样开始的则为出错代码的位置,可以反汇编查看,这样上下对应找到这个地址值对应函数代码,在汇编窗口右键选择Show Disassembly At Address,然后写入这个地址就快速定位这个出错代码附近,

我的程序在调试的时候出现的LF=0xFFFFFFD,然后我在address输入此时的PSP地址,然后找到出错的位置,定位到

STM32F407进入HardFault解决办法小结一点点

经过断点调试一直死在 汇编语句 B  OSStartHang 中,经过一天的查找,发现是keil环境配置的时候勾选Use MicroLib选项导致,取消该选项即。

STM32F407进入HardFault解决办法小结一点点

但是为什么会出现这种原因了  :

查一查MicroLib的原理:

microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。

与缺省 C 库之间的差异

 

microlib 与缺省 C 库之间的主要差异是:

microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。

microlib 不符合 IEEE 754 二进制浮点算法标准。

microlib 进行了高度优化以使代码变得很小。

无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。

不能将 main() 声明为使用参数,并且不能返回内容。

不支持 stdio,但未缓冲的 stdin、stdout 和 stderr 除外。

microlib 对 C99 函数提供有限的支持。

microlib 不支持操作系统函数。

microlib 不支持与位置无关的代码。

microlib 不提供互斥锁来防止非线程安全的代码。

microlib 不支持宽字符或多字节字符串。

与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。

可以合理地将 microlib 与 --fpmode=std 或 --fpmode=fast 配合使用。

microlib 中的函数负责:

创建一个可在其中执行 C 程序的环境。 这包括:

创建一个堆栈

创建一个堆(如果需要)

初始化程序所用的库的部分组成内容。

调用 main() 以开始执行程序。

要使用 microlib 构建程序,必须使用命令行选项 ??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项