From 59ce4f401beb56ad6257fa96d8e4e3aec14d3a6c Mon Sep 17 00:00:00 2001 From: rtel Date: Fri, 5 Jul 2019 20:21:59 +0000 Subject: [PATCH] Exercise the new vPortGetHeapStats() function from the Win32 demo projects. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2673 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo | Bin 73728 -> 77312 bytes FreeRTOS/Demo/WIN32-MSVC/FreeRTOSConfig.h | 3 +- FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj | 1 + .../Demo/WIN32-MSVC/WIN32.vcxproj.filters | 3 + FreeRTOS/Demo/WIN32-MSVC/main_full.c | 16 +++- FreeRTOS/Demo/WIN32-MingW/main.c | 81 ++++++++++++++++++ FreeRTOS/Demo/WIN32-MingW/main_full.c | 18 +++- 7 files changed, 113 insertions(+), 9 deletions(-) diff --git a/FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo b/FreeRTOS/Demo/WIN32-MSVC/.vs/WIN32/v14/.suo index 7f5848df53f7fad54b9402d24e9b1955ffc3aab4..324972876a6280982943ae5aea8be03b1acfcf91 100644 GIT binary patch delta 5128 zcmc&&4OCRe6`pzQgSY&-D}Sr$Ec00wREL$gFjk!q0jO+PT{22q1bXQkh2+5vr#A z5V-<{R76%&{xG;HOAMNf3i~V<%ONm|AE9^-r6R;E#B2l@cw^8~6x=QL)xfTRkS4Pr zv!c<)8Rh0hHC}u*c=1)|&6nqU0YCHfhOxt=?qQKJ$m%f`v0?Q9h1vBDxXB5bT57 zVo*Sc&pkn~R}TA2vYCC%7I9XRvm($Nqb9WP8o-{al>`9>7pgql!{+EBo^pw{8) zLrekx25N^PUq2a6=!?a;;kT)%9{v%vB`3mZP=Pb@r6?n*Ad86wgE0{3+g=pc`r;pF z_vEknDy`g~1rty~7GRu4Qbp=nS8w|uB~s2G45d>!OmAzqBAF(+OpN4ej-u! zl)IB)nRi~6-LI7G7u5+LQAa3e8?#!e8Y;U|W88W1aPpMjU%J|MO7gUK%q8V(2c9-+ zpP3XKcw~vGHlY0j_Cnm3K9lQI8>s4ebjPw8o7u%!vcw^+7;9`~r~#D<|JYA`qTx5||mTRmbG zVl|?%DL+-&gaXSSEO%hv`?j#GElw+Fr=ow(H`JyL9rXFl$hRI1f0DkkY@F}S7n5L@ zGfd3T&Zf$Fr}M9Uwka)szq$3p`RBq#){=4*E}@AyA(xZq&ai!j*p)ne1okI|b{6WW zkb@SMSY4}OMuQ`lvrYQ(6EJ090?s7#+m`g3Uu-ViV5-cY9&aG&#*D0uc2d2#Aw-^d zXwnrHPk@G$lO?!xEaWH5)y`Ze9duU%aAwLVTaiv+SwF~wyrBF2|PhdMK+t-gUXG1H%jajE;Y@_m+#opP0)K)&>M`bv+$=sRYBv))wOBv3U zMlkvPxP0?O9Gn=g^~yOqeP(Cz1nNrOB@GZ;xmsLptfhBT>N^DknHdkuik`Wb)4BI> z%Fn^-^>Cx)luV71r|a;;gh6kq2I3yU7&+~K%>DN=DSQR7&VwD3ePs8!!4zfm>{a@Ie2kT3><9F<;GIjv8Nnb*Jwbq zKN_+VSHqnBGdQ9Jr>!11cnX|t3Q#n5&^TDxu7&8PXW6$@1GRgi;mTtQ$x9CN5-D1t zkb~wekJ^%)ke%!dn2D={trd%D^I+XJ z2&TOg1B!LkQXtmUW>+8tj@niRj!l0&Ep0;DxU{t8dzmY_rF8KNC1#V!D7ia%Y!5wv z_7y_TBE7z#FmF0KPJ+tc0esXNg01};qIa}X0<<|xiqamf%Cp+IHg7wlW&sZk$zS5}H zU7qMNq2R|X8bg1JVy;6$mFyVmdIFvMP!OPUH?S^4%-(5^!-9YRc>mzI_Rk_VrPv@J z!ofQtlm8co>dra#K%^rD9Ce)J*ybTUDndCz{x{4&PCc#m9L+_!*o*nE9Ongb<+-P+ zGTl>&$eb)S55Zw>2kSeN#lw4XwLkyv%r506ieyzp2L3xSnxv6*Jou$Z(pWNzq`=Y0 zwO&_)hj~8pc_<@Q4PR~7{s5Eq7@kJ3y@AGww8tc)+d%pH8hGgqg&#YD<3U!e>^1q& zdNfys4BVaAOj9Fl%r0&^xrjpRJ_}6C3byBP)E4AE7?UUQdYS+SVKlP)e<1ODd(~AL zNKbLDZVkGtTk!Fz7-;;L1sb0Y?z%9DZt$V3n`^x4F=k@yb9`tW-hPn*xP4v-DK4OF4v6E?^PfcwNI8Yd;%A?e2>h_AY{E`urQ?OR7Eq delta 4490 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 + diff --git a/FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj.filters b/FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj.filters index ae43ea750..0fcb7b740 100644 --- a/FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj.filters +++ b/FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj.filters @@ -160,6 +160,9 @@ Demo App Source\Full_Demo\Common Demo Tasks + + FreeRTOS Source\Source + diff --git a/FreeRTOS/Demo/WIN32-MSVC/main_full.c b/FreeRTOS/Demo/WIN32-MSVC/main_full.c index 3f19db32e..81d84750c 100644 --- a/FreeRTOS/Demo/WIN32-MSVC/main_full.c +++ b/FreeRTOS/Demo/WIN32-MSVC/main_full.c @@ -245,6 +245,7 @@ static void prvCheckTask( void *pvParameters ) { TickType_t xNextWakeTime; const TickType_t xCycleFrequency = pdMS_TO_TICKS( 4000UL ); +HeapStats_t xHeapStats; /* Just to remove compiler warning. */ ( void ) pvParameters; @@ -370,10 +371,17 @@ const TickType_t xCycleFrequency = pdMS_TO_TICKS( 4000UL ); /* This is the only task that uses stdout so its ok to call printf() directly. */ - printf( "%s - tick count %zu - free heap %zu - min free heap %zu\r\n", pcStatusMessage, - xTaskGetTickCount(), - xPortGetFreeHeapSize(), - xPortGetMinimumEverFreeHeapSize() ); + vPortGetHeapStats( &xHeapStats ); + + configASSERT( xHeapStats.xAvailableHeapSpaceInBytes == xPortGetFreeHeapSize() ); + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == xPortGetMinimumEverFreeHeapSize() ); + + printf( "%s - tick count %zu - free heap %zu - min free heap %zu - largest free block %zu \r\n", + pcStatusMessage, + xTaskGetTickCount(), + xHeapStats.xAvailableHeapSpaceInBytes, + xHeapStats.xMinimumEverFreeBytesRemaining, + xHeapStats.xSizeOfLargestFreeBlockInBytes ); } } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/WIN32-MingW/main.c b/FreeRTOS/Demo/WIN32-MingW/main.c index 2f3b36bfd..2ccf29ac7 100644 --- a/FreeRTOS/Demo/WIN32-MingW/main.c +++ b/FreeRTOS/Demo/WIN32-MingW/main.c @@ -103,6 +103,12 @@ void vFullDemoIdleFunction( void ); */ static void prvInitialiseHeap( void ); +/* + * Performs a few sanity checks on the behaviour of the vPortGetHeapStats() + * function. + */ +static void prvExerciseHeapStats( void ); + /* * Prototypes for the standard FreeRTOS application hook (callback) functions * implemented within this file. See http://www.freertos.org/a00016.html . @@ -344,6 +350,8 @@ offsets into the array - with gaps in between and messy alignment just for test purposes. */ static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; volatile uint32_t ulAdditionalOffset = 19; /* Just to prevent 'condition is always true' warnings in configASSERT(). */ +HeapStats_t xHeapStats; +const HeapStats_t xZeroHeapStats = { 0 }; const HeapRegion_t xHeapRegions[] = { /* Start address with dummy offsets Size */ @@ -360,7 +368,80 @@ const HeapRegion_t xHeapRegions[] = /* Prevent compiler warnings when configASSERT() is not defined. */ ( void ) ulAdditionalOffset; + /* The heap has not been initialised yet so expect stats to all be zero. */ + vPortGetHeapStats( &xHeapStats ); + configASSERT( memcmp( &xHeapStats, &xZeroHeapStats, sizeof( HeapStats_t ) ) == 0 ); + vPortDefineHeapRegions( xHeapRegions ); + + /* Sanity check vTaskGetHeapStats(). */ + prvExerciseHeapStats(); +} +/*-----------------------------------------------------------*/ + +static void prvExerciseHeapStats( void ) +{ +HeapStats_t xHeapStats; +size_t xInitialFreeSpace = xPortGetFreeHeapSize(), xMinimumFreeBytes; +size_t xMetaDataOverhead, i; +void *pvAllocatedBlock; +const size_t xArraySize = 5, xBlockSize = 1000UL; +void *pvAllocatedBlocks[ xArraySize ]; + + /* Check heap stats are as expected after initialisation but before any + allocations. */ + vPortGetHeapStats( &xHeapStats ); + + /* Minimum ever free bytes remaining should be the same as the total number + of bytes as nothing has been allocated yet. */ + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == xHeapStats.xAvailableHeapSpaceInBytes ); + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == xInitialFreeSpace ); + + /* Nothing has been allocated or freed yet. */ + configASSERT( xHeapStats.xNumberOfSuccessfulAllocations == 0 ); + configASSERT( xHeapStats.xNumberOfSuccessfulFrees == 0 ); + + /* Allocate a 1000 byte block then measure what the overhead of the + allocation in regards to how many bytes more than 1000 were actually + removed from the heap in order to store metadata about the allocation. */ + pvAllocatedBlock = pvPortMalloc( xBlockSize ); + configASSERT( pvAllocatedBlock ); + xMetaDataOverhead = ( xInitialFreeSpace - xPortGetFreeHeapSize() ) - xBlockSize; + + /* Free the block again to get back to where we started. */ + vPortFree( pvAllocatedBlock ); + vPortGetHeapStats( &xHeapStats ); + configASSERT( xHeapStats.xAvailableHeapSpaceInBytes == xInitialFreeSpace ); + configASSERT( xHeapStats.xNumberOfSuccessfulAllocations == 1 ); + configASSERT( xHeapStats.xNumberOfSuccessfulFrees == 1 ); + + /* Allocate blocks checking some stats value on each allocation. */ + for( i = 0; i < xArraySize; i++ ) + { + pvAllocatedBlocks[ i ] = pvPortMalloc( xBlockSize ); + configASSERT( pvAllocatedBlocks[ i ] ); + vPortGetHeapStats( &xHeapStats ); + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == ( xInitialFreeSpace - ( ( i + 1 ) * ( xBlockSize + xMetaDataOverhead ) ) ) ); + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == xHeapStats.xAvailableHeapSpaceInBytes ); + configASSERT( xHeapStats.xNumberOfSuccessfulAllocations == ( 2Ul + i ) ); + configASSERT( xHeapStats.xNumberOfSuccessfulFrees == 1 ); /* Does not increase during allocations. */ + } + + configASSERT( xPortGetFreeHeapSize() == xPortGetMinimumEverFreeHeapSize() ); + xMinimumFreeBytes = xPortGetFreeHeapSize(); + + /* Free the blocks again. */ + for( i = 0; i < xArraySize; i++ ) + { + vPortFree( pvAllocatedBlocks[ i ] ); + vPortGetHeapStats( &xHeapStats ); + configASSERT( xHeapStats.xAvailableHeapSpaceInBytes == ( xInitialFreeSpace - ( ( ( xArraySize - i - 1 ) * ( xBlockSize + xMetaDataOverhead ) ) ) ) ); + configASSERT( xHeapStats.xNumberOfSuccessfulAllocations == ( xArraySize + 1 ) ); /* Does not increase during frees. */ + configASSERT( xHeapStats.xNumberOfSuccessfulFrees == ( 2UL + i ) ); + } + + /* The minimum ever free heap size should not change as blocks are freed. */ + configASSERT( xMinimumFreeBytes == xPortGetMinimumEverFreeHeapSize() ); } /*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Demo/WIN32-MingW/main_full.c b/FreeRTOS/Demo/WIN32-MingW/main_full.c index 13a66910a..84ae4074e 100644 --- a/FreeRTOS/Demo/WIN32-MingW/main_full.c +++ b/FreeRTOS/Demo/WIN32-MingW/main_full.c @@ -260,6 +260,7 @@ static void prvCheckTask( void *pvParameters ) { TickType_t xNextWakeTime; const TickType_t xCycleFrequency = pdMS_TO_TICKS( 2500UL ); +HeapStats_t xHeapStats; /* Just to remove compiler warning. */ ( void ) pvParameters; @@ -385,10 +386,19 @@ const TickType_t xCycleFrequency = pdMS_TO_TICKS( 2500UL ); /* This is the only task that uses stdout so its ok to call printf() directly. */ - printf( "%s - tick count %u - free heap %u - min free heap %u\r\n", pcStatusMessage, - xTaskGetTickCount(), - xPortGetFreeHeapSize(), - xPortGetMinimumEverFreeHeapSize() ); + vPortGetHeapStats( &xHeapStats ); + + configASSERT( xHeapStats.xAvailableHeapSpaceInBytes == xPortGetFreeHeapSize() ); + configASSERT( xHeapStats.xMinimumEverFreeBytesRemaining == xPortGetMinimumEverFreeHeapSize() ); + + printf( "%s - tick count %u - free heap %u - min free heap %u - largest free block %u - number of free blocks %u\r\n", + pcStatusMessage, + xTaskGetTickCount(), + xHeapStats.xAvailableHeapSpaceInBytes, + xHeapStats.xMinimumEverFreeBytesRemaining, + xHeapStats.xSizeOfLargestFreeBlockInBytes, + xHeapStats.xNumberOfFreeBlocks ); + fflush( stdout ); } } -- 2.39.2