if( pv != NULL )
{
/* The memory being freed will have an BlockLink_t structure immediately
before it. */
puc -= heapSTRUCT_SIZE;
/* This casting is to keep the compiler from issuing warnings. */
pxLink = ( void * ) puc;
/* ignore some lines */
}
vPortFree PROC
PUSH {r4-r6,lr}
MOV r5,r1
MOV r4,r0
CMP r0,#0
BEQ |L1.720|
SUBS r4,r4,#8
Why FreeRTOS defines heapSTRUCT_SIZE as a const variable rather than a macro?
I find headSTRUCTSIZE is defined as a const variable, but my compiler always optimizate it.
I have check the disassemble file os heap5.o, and I found the code “puc -= heapSTRUCT_SIZE;” is translated into “SUBS r4,r4,#8” automatically.
Is there any difference between “define heapSTRUCT_SIZE as a const variable” and “define heapSTRUCT_SIZE as a macro“?
static const uint16t heapSTRUCTSIZE = ( ( sizeof ( BlockLinkt ) + ( portBYTEALIGNMENT – 1 ) ) & ~portBYTEALIGNMENTMASK );
void vPortFree( void *pv , RAM_TYPE ramType)
{
uint8_t *puc = ( uint8_t * ) pv;
BlockLink_t *pxLink;
Why FreeRTOS defines heapSTRUCT_SIZE as a const variable rather than a macro?
If you use a macro with low or no compiler optimization it will be calculated each time it is used. If you use a const then it is calculated when you compile the program.
Why FreeRTOS defines heapSTRUCT_SIZE as a const variable rather than a macro?
Dear Dave,
I think the fact is always the opposite. If we use a const and close the compiler’s optimization, some variable reference this const may calculated everytime when program run.