本帖最后由 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();
}
|