STM32
直播中

王健

7年用户 946经验值
私信 关注
[问答]

STM32F7使用FreeRTOS,程序运行一段时间后进入HardFault_Handler的原因?

大家好,最近学习在STM32F7上使用FreeRTOS,程序运行一段时间后进入HardFault_Handler,该时间不定。故障分析器给的报错信息为“总线,存储器管理或使用失败(FORCED)”,“精准的数据访问冲突(PRECISERR)”。
      其中工程中线程共6个。线程A每秒打印时间;线程B负责串口1发送命令;线程C负责接收串口1数据,并通过队列给线程D、线程E、和线程F发送数据;线程D负责通过队列获取C发送的数据,并将数据处理后通过队列将结果发送给线程F;线程E负责将接收的数据保存到SD卡;线程F负责将接收的数据通过串口2发送出去。其中线程优先级从大到小为C=E>D>F>B>A,每个线程使用堆栈空间设的在10*1024左右。
       附件图片为程序运行时抓取的各线程情况,其中线程G并不是我所创建,程序通过STM32CubeIDE生成后就有,而且线程名称也是乱码,不知道是什么情况,死机会不会是G造成的那?
      

回帖(1)

石玉兰

2024-4-8 17:28:48
在使用FreeRTOS时,程序进入HardFault_Handler的原因可能有以下几种情况:

1. 内存使用错误:程序中可能存在内存泄漏、堆栈溢出等问题,这些问题会导致内存管理失败,进而引发HardFault。

解决方法:检查代码中是否有内存管理错误,尤其是堆栈溢出的问题。可以通过增加任务堆栈大小或使用静态分配的任务来解决。

2. 中断冲突:多个中断之间的优先级或抢占顺序不正确,导致冲突,进而引发HardFault。

解决方法:检查中断优先级和抢占顺序的设置,确保合理的中断处理顺序。

3. 硬件错误:可能存在硬件故障、时钟错误等问题,导致程序运行异常。

解决方法:检查硬件连接、时钟配置是否正确,并排除硬件故障的可能。

4. 资源竞争:多个任务对共享资源的竞争可能导致数据访问错误,从而引发HardFault。

解决方法:使用信号量或互斥量来保护共享资源,以避免资源竞争问题。

根据你提供的问题描述,可能存在以下几个潜在问题:

1. 线程C向线程D、线程E和线程F发送数据的队列是否正确使用。确保队列能够正确传递数据,且不发生溢出或阻塞的情况。

2. 线程D的数据处理过程是否正确。确保数据处理后能够正确发送给线程F。

3. 线程E的SD卡写入操作是否正确,可能存在SD卡写入错误或超时的情况。

4. 线程F向串口2发送数据时是否正确处理了串口的初始化和发送操作。确保串口配置正确,并检查是否有数据发送错误。

你可以根据以上建议进行排查和调试,以确定问题所在。可以使用调试工具、日志输出等方式来帮助定位错误位置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分