硬汉嵌入式论坛

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

[RTOS] 求助:freertos运行一段时间以后,调用vPortGetHeapStats导致HardFault,该如何找问题

[复制链接]

5

主题

11

回帖

31

积分

新手上路

积分
31
发表于 2023-11-16 15:02:35 | 显示全部楼层 |阅读模式
本帖最后由 regsofweb 于 2023-11-16 15:06 编辑

CPU是H723,Cube内建的FREERTOS,一开始是正常的,可以查看任务和堆栈的统计信息
跑了一段时间之后,想查询看系统的情况
先调用uxTaskGetSystemState,查看任务,正常
得到
------------ Task Info --------------
Name            |ID|Stack |eState   
-------------------------------------
defaultTask     | 1|  1854|Blocked
taskGrpCtrl     | 2|  1964|Blocked
taskCli         | 3|  1886|Running
taskSensor      | 4|   942|Blocked
IDLE            | 5|    40|Ready
Tmr Svc         | 6|    67|Blocked
tcpip_thread    | 7|   911|Blocked
EthIf           | 8|   417|Blocked
EthLink         | 9|   365|Blocked
-------------------------------------
Note: Stack is remains of space(4-byte)
0 means overflowing
看起来任务栈都正常,没有爆


再调用vPortGetHeapStats,查看heap,
如果正常,应该显示
------------ Heap Info -------------
xAvailableHeapSpaceInBytes =        26616
xSizeOfLargestFreeBlockInBytes =    26616
xSizeOfSmallestFreeBlockInBytes =    26616
xNumberOfFreeBlocks =            1
xMinimumEverFreeBytesRemaining =    26280
xNumberOfSuccessfulAllocations =    24
xNumberOfSuccessfulFrees =        2



但是却跳到Hardfault。该如何查找错误呢?


在heap_4.c中的源码

[C] 纯文本查看 复制代码
void vPortGetHeapStats( HeapStats_t *pxHeapStats )
{
BlockLink_t *pxBlock;
size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */

    vTaskSuspendAll();
    {
        pxBlock = xStart.pxNextFreeBlock;

        /* pxBlock will be NULL if the heap has not been initialised.  The heap
        is initialised automatically when the first allocation is made. */
        if( pxBlock != NULL )
        {
            do
            {
                /* Increment the number of blocks and record the largest block seen
                so far. */
                xBlocks++;

                if( pxBlock->xBlockSize > xMaxSize )         //《《《《在这里,出现HardFault,pxBlock的值为0x2803c7e0,在reserved区域,导致hardfault
                {
                    xMaxSize = pxBlock->xBlockSize;
                }

                if( pxBlock->xBlockSize < xMinSize )
                {
                    xMinSize = pxBlock->xBlockSize;
                }

                /* Move to the next block in the chain until the last block is
                reached. */
                pxBlock = pxBlock->pxNextFreeBlock;
            } while( pxBlock != pxEnd );
        }
    }
    xTaskResumeAll();

    pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize;
    pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;
    pxHeapStats->xNumberOfFreeBlocks = xBlocks;

    taskENTER_CRITICAL();
    {
        pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining;
        pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;
        pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees;
        pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;
    }
    taskEXIT_CRITICAL();
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-16 15:05:23 | 显示全部楼层
如果用的MDK,先查看 faults reports调试组件错误类型。
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-16 15:27:20 | 显示全部楼层
可以确认是xStart这个链表出问题了,但是如何找到哪里导致这个链表出问题呢
开始的时候
good.jpg
出错的时候
ng.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-16 15:37:54 | 显示全部楼层
这种的大概率有任务的栈溢出了,或者内存访问越界了。

可以所以任务创建全部注释掉,然后逐一开启排查。
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2023-11-16 15:45:57 | 显示全部楼层
溢出了吧,是不是哪个任务申请内存释放啊
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-17 07:10:14 | 显示全部楼层
找到问题了,分配了一块内存,做循环里面系统错误检查时用了位与操作,但是循环数忘了除以8,就写越界了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 06:11 , Processed in 0.180681 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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