diff --git a/CMakeLists.txt b/CMakeLists.txt index 15bbe0bf601..c092da6c381 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,22 +273,26 @@ target_compile_options(freertos_kernel PRIVATE ######################################################################## -add_subdirectory(include) -add_subdirectory(portable) +include(${CMAKE_CURRENT_LIST_DIR}/include/CMakeLists.txt) +include(${CMAKE_CURRENT_LIST_DIR}/portable/CMakeLists.txt) target_sources(freertos_kernel PRIVATE - croutine.c - event_groups.c - list.c - queue.c - stream_buffer.c - tasks.c - timers.c - - # If FREERTOS_HEAP is digit between 1 .. 5 - it is heap number, otherwise - it is path to custom heap source file - $>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c> + ${CMAKE_CURRENT_LIST_DIR}/croutine.c + ${CMAKE_CURRENT_LIST_DIR}/event_groups.c + ${CMAKE_CURRENT_LIST_DIR}/list.c + ${CMAKE_CURRENT_LIST_DIR}/queue.c + ${CMAKE_CURRENT_LIST_DIR}/stream_buffer.c + ${CMAKE_CURRENT_LIST_DIR}/tasks.c + ${CMAKE_CURRENT_LIST_DIR}/timers.c ) +# Check if user requested to not include a heap implementation +if(NOT DEFINED FREERTOS_DO_NOT_INCLUDE_HEAP) + target_sources(freertos_kernel PRIVATE + # If FREERTOS_HEAP is digit between 1 .. 5 - it is heap number, otherwise - it is path to custom heap source file + $>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c> + ) +endif() target_link_libraries(freertos_kernel PUBLIC diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 46a1c3e7f5f..7b28df06655 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -4,7 +4,7 @@ add_library(freertos_kernel_include INTERFACE) target_include_directories(freertos_kernel_include INTERFACE - . + ${CMAKE_CURRENT_LIST_DIR}/. # Note: DEPRECATED but still supported, may be removed in a future release. $<$>:${FREERTOS_CONFIG_FILE_DIRECTORY}> ) diff --git a/include/portable.h b/include/portable.h index 615d77d5acf..46bd98be9a4 100644 --- a/include/portable.h +++ b/include/portable.h @@ -132,25 +132,28 @@ #endif #endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */ +/* Only include heap related functions and structs if using dynamic allocation */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + /* Used by heap_5.c to define the start address and size of each memory region * that together comprise the total FreeRTOS heap space. */ -typedef struct HeapRegion -{ - uint8_t * pucStartAddress; - size_t xSizeInBytes; -} HeapRegion_t; + typedef struct HeapRegion + { + uint8_t * pucStartAddress; + size_t xSizeInBytes; + } HeapRegion_t; /* Used to pass information about the heap out of vPortGetHeapStats(). */ -typedef struct xHeapStats -{ - size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ - size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ - size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ - size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ - size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ -} HeapStats_t; + typedef struct xHeapStats + { + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ + } HeapStats_t; /* * Used to define multiple heap regions for use by heap_5.c. This function @@ -163,34 +166,34 @@ typedef struct xHeapStats * terminated by a HeapRegions_t structure that has a size of 0. The region * with the lowest start address must appear first in the array. */ -void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; /* * Returns a HeapStats_t structure filled with information about the current * heap state. */ -void vPortGetHeapStats( HeapStats_t * pxHeapStats ); + void vPortGetHeapStats( HeapStats_t * pxHeapStats ); /* * Map to the memory management routines required for the port. */ -void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; -void * pvPortCalloc( size_t xNum, - size_t xSize ) PRIVILEGED_FUNCTION; -void vPortFree( void * pv ) PRIVILEGED_FUNCTION; -void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; -size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; -size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; - -#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 ) - void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION; - void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION; -#else - #define pvPortMallocStack pvPortMalloc - #define vPortFreeStack vPortFree -#endif + void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; + void * pvPortCalloc( size_t xNum, + size_t xSize ) PRIVILEGED_FUNCTION; + void vPortFree( void * pv ) PRIVILEGED_FUNCTION; + void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; + size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; + size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; -#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + #if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 ) + void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION; + void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION; + #else + #define pvPortMallocStack pvPortMalloc + #define vPortFreeStack vPortFree + #endif + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) /** * task.h @@ -200,8 +203,10 @@ size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; * * This hook function is called when allocation failed. */ - void vApplicationMallocFailedHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ -#endif + void vApplicationMallocFailedHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ + #endif /* ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + +#endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ /* * Setup the hardware ready for the scheduler to take control. This generally