From 4ac68a97d970883adb94b60db39b7d36532afacc Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 1 Dec 2022 21:38:05 +0800 Subject: [PATCH] freertos(SMP): Update SMP FreeRTOS linker fragment file This commit updates the linker fragment file for Amazon SMP FreeRTOS. - Linker fragment file's formatting was updated - Placement rules of functions is now clearly specified inside the linker fragment file. - Some extra functions are now placed in flash in accordance to the new placement rules. --- .../include/freertos/FreeRTOSConfig.h | 2 +- components/freertos/linker_smp.lf | 360 +++++++++++------- 2 files changed, 223 insertions(+), 139 deletions(-) diff --git a/components/freertos/esp_additions/include/freertos/FreeRTOSConfig.h b/components/freertos/esp_additions/include/freertos/FreeRTOSConfig.h index c9651b0b18..5065a781ad 100644 --- a/components/freertos/esp_additions/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/esp_additions/include/freertos/FreeRTOSConfig.h @@ -201,7 +201,7 @@ This file get's pulled into assembly sources. Therefore, some includes need to b #define INCLUDE_xSemaphoreGetMutexHolder 1 #define INCLUDE_xTaskGetHandle 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#define INCLUDE_uxTaskGetStackHighWaterMark2 1 #define INCLUDE_eTaskGetState 1 #define INCLUDE_xTaskResumeFromISR 1 #define INCLUDE_xTimerPendFunctionCall 1 diff --git a/components/freertos/linker_smp.lf b/components/freertos/linker_smp.lf index 6fcf5c998d..38800be64d 100644 --- a/components/freertos/linker_smp.lf +++ b/components/freertos/linker_smp.lf @@ -1,158 +1,242 @@ +# ---------------------------------------------------------------------------------------------------------------------- # Linker fragment file for SMP FreeRTOS (i.e., CONFIG_FREERTOS_SMP=y) -[mapping:freertos] +# Flash function placements are listed per source file, in the order that they appear in the source file. +# +# Placement Rules: +# - Default: Place all functions in internal RAM. +# - CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH: +# - Place functions in flash if they are never called from an ISR context (directly or indirectly). +# - Some functions that are called often (such as critical sections) are placed in internal RAM for speed. +# ---------------------------------------------------------------------------------------------------------------------- + +[mapping:freertos_smp] archive: libfreertos.a entries: - # Default all FreeRTOS functions to IRAM - * (noflash_text) - # Todo: Check if flash placements are missing or can be further optimized IDF-5259 + * (noflash_text) # Default all FreeRTOS functions to IRAM if FREERTOS_PLACE_FUNCTIONS_INTO_FLASH = y: + # -------------------------------------------------------------------------------------------------------------- # event_groups.c - event_groups: xEventGroupCreateStatic (default) - event_groups: xEventGroupCreate (default) - event_groups: xEventGroupSync (default) - event_groups: xEventGroupWaitBits (default) - event_groups: xEventGroupClearBits (default) - event_groups: xEventGroupSetBits (default) - event_groups: vEventGroupDelete (default) - event_groups: vEventGroupSetBitsCallback (default) - event_groups: vEventGroupClearBitsCallback (default) - event_groups: prvTestWaitCondition (default) + # - Exclude all ...FromISR() functions and their dependents + # -------------------------------------------------------------------------------------------------------------- + event_groups:xEventGroupCreateStatic (default) + event_groups:xEventGroupCreate (default) + event_groups:xEventGroupSync (default) + event_groups:xEventGroupWaitBits (default) + event_groups:xEventGroupClearBits (default) + event_groups:xEventGroupSetBits (default) + event_groups:vEventGroupDelete (default) + event_groups:vEventGroupSetBitsCallback (default) + event_groups:vEventGroupClearBitsCallback (default) + event_groups:prvTestWaitCondition (default) if FREERTOS_USE_TRACE_FACILITY = y: event_groups: uxEventGroupGetNumber (default) event_groups: vEventGroupSetNumber (default) + # -------------------------------------------------------------------------------------------------------------- # list.c + # - List/List Item initialization functions are never called from ISR + # -------------------------------------------------------------------------------------------------------------- + list:vListInitialise (default) + list:vListInitialiseItem (default) + # -------------------------------------------------------------------------------------------------------------- # queue.c - queue: xQueueGenericReset (default) - queue: xQueueGenericCreateStatic (default) - queue: xQueueGenericCreate (default) - queue: prvInitialiseNewQueue (default) - queue: prvInitialiseMutex (default) - queue: xQueueCreateMutex (default) - queue: xQueueCreateMutexStatic (default) - queue: xQueueGetMutexHolder (default) - queue: xQueueGiveMutexRecursive (default) - queue: xQueueTakeMutexRecursive (default) - queue: xQueueCreateCountingSemaphoreStatic (default) - queue: xQueueCreateCountingSemaphore (default) - queue: xQueueGenericSend (default) - queue: xQueueReceive (default) - queue: xQueueSemaphoreTake (default) - queue: xQueuePeek (default) - queue: uxQueueMessagesWaiting (default) - queue: uxQueueSpacesAvailable (default) - queue: vQueueDelete (default) + # - Keep all ...FromISR() functions (and their prv... calls) in internal RAM + # - All other functions can be moved to flash + # -------------------------------------------------------------------------------------------------------------- + queue:xQueueGenericReset (default) + queue:xQueueGenericCreateStatic (default) + queue:xQueueGenericCreate (default) + queue:prvInitialiseNewQueue (default) + queue:prvInitialiseMutex (default) + queue:xQueueCreateMutex (default) + queue:xQueueCreateMutexStatic (default) + queue:xQueueGetMutexHolder (default) + queue:xQueueGiveMutexRecursive (default) + queue:xQueueTakeMutexRecursive (default) + queue:xQueueCreateCountingSemaphoreStatic (default) + queue:xQueueCreateCountingSemaphore (default) + queue:xQueueGenericSend (default) + queue:xQueueReceive (default) + queue:xQueueSemaphoreTake (default) + queue:xQueuePeek (default) + queue:uxQueueMessagesWaiting (default) + queue:uxQueueSpacesAvailable (default) + queue:vQueueDelete (default) if FREERTOS_USE_TRACE_FACILITY = y: - queue: uxQueueGetQueueNumber (default) - queue: vQueueSetQueueNumber (default) - queue: ucQueueGetQueueType (default) - queue: prvGetDisinheritPriorityAfterTimeout (default) - queue: prvUnlockQueue (default) - queue: prvIsQueueEmpty (default) - queue: prvIsQueueFull (default) + queue:uxQueueGetQueueNumber (default) + queue:vQueueSetQueueNumber (default) + queue:ucQueueGetQueueType (default) + queue:prvGetDisinheritPriorityAfterTimeout (default) + queue:prvUnlockQueue (default) + queue:prvIsQueueEmpty (default) + queue:prvIsQueueFull (default) if FREERTOS_QUEUE_REGISTRY_SIZE > 0: - queue: vQueueAddToRegistry (default) - queue: pcQueueGetName (default) - queue: vQueueUnregisterQueue (default) - queue: vQueueWaitForMessageRestricted (default) - queue: xQueueCreateSet (default) - queue: xQueueAddToSet (default) - queue: xQueueRemoveFromSet (default) - queue: xQueueSelectFromSet (default) + queue:vQueueAddToRegistry (default) + queue:pcQueueGetName (default) + queue:vQueueUnregisterQueue (default) + queue:vQueueWaitForMessageRestricted (default) + queue:xQueueCreateSet (default) + queue:xQueueAddToSet (default) + queue:xQueueRemoveFromSet (default) + queue:xQueueSelectFromSet (default) + # -------------------------------------------------------------------------------------------------------------- # stream_buffer.c - # tasks.c: Vanilla - tasks: xTaskCreateStatic (default) - tasks: xTaskCreate (default) + # -------------------------------------------------------------------------------------------------------------- + stream_buffer:xStreamBufferGenericCreate (default) + stream_buffer:xStreamBufferGenericCreateStatic (default) + stream_buffer:vStreamBufferDelete (default) + stream_buffer:xStreamBufferReset (default) + stream_buffer:xStreamBufferSetTriggerLevel (default) + stream_buffer:xStreamBufferBytesAvailable (default) + stream_buffer:xStreamBufferSend (default) + stream_buffer:xStreamBufferReceive (default) + stream_buffer:xStreamBufferNextMessageLengthBytes (default) + stream_buffer:xStreamBufferIsEmpty (default) + stream_buffer:xStreamBufferIsFull (default) + stream_buffer:prvWriteBytesToBuffer (default) + stream_buffer:prvReadBytesFromBuffer (default) + stream_buffer:prvInitialiseNewStreamBuffer (default) + if FREERTOS_USE_TRACE_FACILITY = y: + stream_buffer:uxStreamBufferGetStreamBufferNumber (default) + stream_buffer:vStreamBufferSetStreamBufferNumber (default) + stream_buffer:ucStreamBufferGetStreamBufferType (default) + # -------------------------------------------------------------------------------------------------------------- + # tasks.c + # - The following functions are called when the cache is disabled, thus they are excluded from the list below + # (i.e., called after "spi_flash_disable_interrupts_caches_and_other_cpu()" is called). + # - "xTaskGetSchedulerState" + # - "xTaskGetTickCount" + # -------------------------------------------------------------------------------------------------------------- + tasks:xTaskCreateStatic (default) + tasks:xTaskCreate (default) if FREERTOS_UNICORE = n: - tasks: xTaskCreateStaticAffinitySet (default) - tasks: xTaskCreateAffinitySet (default) - tasks: vTaskCoreAffinitySet (default) - tasks: vTaskCoreAffinityGet (default) - tasks: prvMinimalIdleTask (default) - tasks: prvInitialiseNewTask (default) - tasks: prvAddNewTaskToReadyList (default) - tasks: vTaskDelete (default) - tasks: xTaskDelayUntil (default) - tasks: vTaskDelay (default) - tasks: eTaskGetState (default) - tasks: uxTaskPriorityGet (default) - tasks: vTaskPrioritySet (default) - tasks: vTaskSuspend (default) - tasks: vTaskResume (default) - tasks: prvCreateIdleTasks (default) - tasks: vTaskStartScheduler (default) - tasks: vTaskEndScheduler (default) - tasks: vTaskSuspendAll (default) - #Todo: prvGetExpectedIdleTime - tasks: xTaskResumeAll (default) - tasks: uxTaskGetNumberOfTasks (default) - tasks: pcTaskGetName (default) - tasks: prvSearchForNameWithinSingleList (default) - tasks: xTaskGetHandle (default) + tasks:xTaskCreateStaticAffinitySet (default) + tasks:xTaskCreateAffinitySet (default) + tasks:vTaskCoreAffinitySet (default) + tasks:vTaskCoreAffinityGet (default) + tasks:prvMinimalIdleTask (default) + tasks:prvInitialiseNewTask (default) + tasks:prvAddNewTaskToReadyList (default) + tasks:vTaskDelete (default) + tasks:xTaskDelayUntil (default) + tasks:vTaskDelay (default) + tasks:eTaskGetState (default) + tasks:uxTaskPriorityGet (default) + tasks:vTaskPrioritySet (default) + tasks:vTaskSuspend (default) + tasks:vTaskResume (default) + tasks:prvCreateIdleTasks (default) + tasks:vTaskStartScheduler (default) + tasks:vTaskEndScheduler (default) + tasks:vTaskSuspendAll (default) + #Todo:prvGetExpectedIdleTime + tasks:xTaskResumeAll (default) + tasks:uxTaskGetNumberOfTasks (default) + tasks:pcTaskGetName (default) + tasks:prvSearchForNameWithinSingleList (default) + tasks:xTaskGetHandle (default) if FREERTOS_USE_TRACE_FACILITY = y: - tasks: uxTaskGetSystemState (default) - tasks: uxTaskGetTaskNumber (default) - tasks: vTaskSetTaskNumber (default) - tasks: vTaskGetInfo (default) - tasks: prvListTasksWithinSingleList (default) - tasks: prvTaskCheckFreeStackSpace (default) - tasks: xTaskGetIdleTaskHandle (default) - tasks: xTaskAbortDelay (default) - tasks: vTaskPlaceOnEventList (default) - tasks: vTaskRemoveFromUnorderedEventList (default) - tasks: vTaskPlaceOnEventListRestricted (default) - tasks: vTaskSetTimeOutState (default) - tasks: vTaskInternalSetTimeOutState (default) - tasks: xTaskCheckForTimeOut (default) - tasks: vTaskMissedYield (default) - tasks: prvIdleTask (default) + tasks:uxTaskGetSystemState (default) + tasks:uxTaskGetTaskNumber (default) + tasks:vTaskSetTaskNumber (default) + tasks:vTaskGetInfo (default) + tasks:prvListTasksWithinSingleList (default) + tasks:prvTaskCheckFreeStackSpace (default) + tasks:xTaskGetIdleTaskHandle (default) + tasks:xTaskAbortDelay (default) + tasks:vTaskPlaceOnEventList (default) + tasks:vTaskRemoveFromUnorderedEventList (default) + tasks:vTaskPlaceOnEventListRestricted (default) + tasks:vTaskSetTimeOutState (default) + tasks:vTaskInternalSetTimeOutState (default) + tasks:xTaskCheckForTimeOut (default) + tasks:vTaskMissedYield (default) + tasks:prvIdleTask (default) if FREERTOS_THREAD_LOCAL_STORAGE_POINTERS > 0: - tasks: vTaskSetThreadLocalStoragePointer (default) - tasks: pvTaskGetThreadLocalStoragePointer (default) - tasks: prvInitialiseTaskLists (default) - tasks: prvCheckTasksWaitingTermination (default) - tasks: uxTaskGetStackHighWaterMark (default) - tasks: prvDeleteTCB (default) + tasks:vTaskSetThreadLocalStoragePointer (default) + tasks:pvTaskGetThreadLocalStoragePointer (default) + tasks:prvInitialiseTaskLists (default) + tasks:prvCheckTasksWaitingTermination (default) + tasks:uxTaskGetStackHighWaterMark (default) + tasks:prvDeleteTCB (default) if FREERTOS_USE_STATS_FORMATTING_FUNCTIONS = y: - tasks: prvWriteNameToBuffer (default) - tasks: vTaskList (default) + tasks:prvWriteNameToBuffer (default) + tasks:vTaskList (default) if FREERTOS_GENERATE_RUN_TIME_STATS = y: - tasks: vTaskGetRunTimeStats (default) - tasks: ulTaskGetIdleRunTimeCounter (default) - tasks: uxTaskResetEventItemValue (default) - tasks: pvTaskIncrementMutexHeldCount (default) - tasks: ulTaskGenericNotifyTake (default) - tasks: xTaskGenericNotifyWait (default) - tasks: xTaskGenericNotify (default) - tasks: xTaskGenericNotifyStateClear (default) - tasks: ulTaskGenericNotifyValueClear (default) - # port - port: pxPortInitialiseStack (default) - port: xPortStartScheduler (default) + tasks:vTaskGetRunTimeStats (default) + tasks:ulTaskGetIdleRunTimeCounter (default) + tasks:uxTaskResetEventItemValue (default) + tasks:pvTaskIncrementMutexHeldCount (default) + tasks:ulTaskGenericNotifyTake (default) + tasks:xTaskGenericNotifyWait (default) + tasks:xTaskGenericNotify (default) + tasks:xTaskGenericNotifyStateClear (default) + tasks:ulTaskGenericNotifyValueClear (default) + # -------------------------------------------------------------------------------------------------------------- # timers.c - timers: xTimerCreateTimerTask (default) - timers: xTimerCreate (default) - timers: xTimerCreateStatic (default) - timers: prvInitialiseNewTimer (default) - timers: xTimerGenericCommandFromTask (default) - timers: xTimerGetTimerDaemonTaskHandle (default) - timers: xTimerGetPeriod (default) - timers: vTimerSetReloadMode (default) - timers: uxTimerGetReloadMode (default) - timers: xTimerGetExpiryTime (default) - timers: pcTimerGetName (default) - timers: prvProcessExpiredTimer (default) - timers: prvTimerTask (default) - timers: prvProcessTimerOrBlockTask (default) - timers: prvGetNextExpireTime (default) - timers: prvSampleTimeNow (default) - timers: prvInsertTimerInActiveList (default) - timers: prvProcessReceivedCommands (default) - timers: prvSwitchTimerLists (default) - timers: prvCheckForValidListAndQueue (default) - timers: xTimerIsTimerActive (default) - timers: pvTimerGetTimerID (default) - timers: vTimerSetTimerID (default) - timers: xTimerPendFunctionCall (default) + # - Only timer function called from ISR is xTimerGenericCommandFromISR() and its dependents + # -------------------------------------------------------------------------------------------------------------- + timers:xTimerCreateTimerTask (default) + timers:xTimerCreate (default) + timers:xTimerCreateStatic (default) + timers:prvInitialiseNewTimer (default) + timers:xTimerGenericCommandFromTask (default) + timers:xTimerGetTimerDaemonTaskHandle (default) + timers:xTimerGetPeriod (default) + timers:vTimerSetReloadMode (default) + timers:uxTimerGetReloadMode (default) + timers:xTimerGetExpiryTime (default) + timers:pcTimerGetName (default) + timers:prvProcessExpiredTimer (default) + timers:prvTimerTask (default) + timers:prvProcessTimerOrBlockTask (default) + timers:prvGetNextExpireTime (default) + timers:prvSampleTimeNow (default) + timers:prvInsertTimerInActiveList (default) + timers:prvProcessReceivedCommands (default) + timers:prvSwitchTimerLists (default) + timers:prvCheckForValidListAndQueue (default) + timers:xTimerIsTimerActive (default) + timers:pvTimerGetTimerID (default) + timers:vTimerSetTimerID (default) + timers:xTimerPendFunctionCall (default) if FREERTOS_USE_TRACE_FACILITY = y: - timers: uxTimerGetTimerNumber (default) - timers: vTimerSetTimerNumber (default) + timers:uxTimerGetTimerNumber (default) + timers:vTimerSetTimerNumber (default) + # -------------------------------------------------------------------------------------------------------------- + # portable/xtensa/port.c + # - Most functions are called from an ISR context, except for scheduler/task init/deinit functions + # -------------------------------------------------------------------------------------------------------------- + if IDF_TARGET_ARCH_XTENSA = y: + port:vPortSetupTimer (default) + port:xPortStartScheduler (default) + port:vPortEndScheduler (default) + port:pvPortMalloc (default) + port:vPortFree (default) + port:vPortInitialiseBlocks (default) + port:xPortGetFreeHeapSize (default) + if FREERTOS_TASK_FUNCTION_WRAPPER = y: + port:vPortTaskWrapper (default) + port:pxPortInitialiseStack (default) + if FREERTOS_UNICORE = n: + port:vPortCleanUpCoprocArea (default) + if FREERTOS_TLSP_DELETION_CALLBACKS = y: + port:vPortTLSPointersDelCb (default) + port:vPortCleanUpTCB (default) + # -------------------------------------------------------------------------------------------------------------- + # portable/riscv/port.c + # - Most functions are called from an ISR context, except for scheduler/task init/deinit functions + # -------------------------------------------------------------------------------------------------------------- + if IDF_TARGET_ARCH_RISCV = y: + port:vPortSetupTimer (default) + port:xPortStartScheduler (default) + port:vPortEndScheduler (default) + port:pvPortMalloc (default) + port:vPortFree (default) + port:vPortInitialiseBlocks (default) + port:xPortGetFreeHeapSize (default) + if FREERTOS_TASK_FUNCTION_WRAPPER = y: + port:vPortTaskWrapper (default) + port:pxPortInitialiseStack (default) + if FREERTOS_TLSP_DELETION_CALLBACKS = y: + port:vPortTLSPointersDelCb (default) + port:vPortCleanUpTCB (default)