硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5682|回复: 2
收起左侧

[FreeRTOS] 请问下运行FreeRTOS的时候卡死如何定位到问题点?

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2021-4-22 10:10:38 | 显示全部楼层 |阅读模式
STM32跑FreeRTOS,一开始正常的,跑了两个多小时,就卡死了,估计很可能卡在HardFault_Handler了,因为卡的时候没debug,现在在debug等它卡死。
>使用的OS资源有消息队列、任务通知、共享内存heap4、五个任务,硬件资源有SPI+DMA。
>一个1级LED闪烁任务,这个任务无关紧要,只是操作IO口再延时再操作而已。
>三个2级任务,这三个任务本质是申请一段内存,把内存填满,然后通过SPI+DMA方式发送出去,然后释放内存。
>一个3级任务,负责SPI+DMA传输,前面三个2级任务就像把数据传给这个任务。
(这个代码的本质是实现SPI屏幕的区域刷新实验,三个2级任务负责不同区域的刷新,一个3级任务负责具体的硬件通信)
>卡死的时候内存还有12K多,(共享内存总共16K,通过xPortGetFreeHeapSize获取剩余内存并将其显示在屏幕上,这是其中一个任务的工作)
>卡死的时候运行了7700多秒,(三个任务之一的工作是每延时1s计数一次并显示在屏幕上)
假如是卡在HardFault_Handler的话,请问各位有没有好的问题定位思路,如何找到问题代码?
1、另外有个疑问,heap4有碎片整理机制,这个是不是得要用户自己去调用接口整理?
2、三个任务申请的内存大小都不一样的,当然每次用完都有释放,并且申请的数量规定了最多2,每次申请最大4K,不确定这种做法是否会导致碎片增多,当碎片足够多时有没有可能进入HardFault_Handler?
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-4-22 14:17:31 | 显示全部楼层
好吧确实是内存共享的问题,在prvInsertBlockIntoFreeList里进入了HardFault_Handler。。。应该是指针非法访问了,具体原因未解。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106715
QQ
发表于 2021-4-23 08:20:23 | 显示全部楼层
celerom 发表于 2021-4-22 14:17
好吧确实是内存共享的问题,在prvInsertBlockIntoFreeList里进入了HardFault_Handler。。。应该是指针非法 ...

我觉得你的程序设计框架要先修改下,

将你的这个三个2级任务合并成一个任务实现,不要在三个任务里面实现,降低程序设计复杂度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 14:51 , Processed in 0.208065 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表