diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index c824ffda68..d5ba05940c 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -417,6 +417,13 @@ menu "FreeRTOS" would be checked to be in compliance with Vanilla FreeRTOS. e.g Calling port*_CRITICAL from ISR context would cause assert failure + config FREERTOS_PLACE_FUNCTIONS_INTO_FLASH + bool "Place FreeRTOS functions into Flash" + default n + help + When enabled the selected Non-ISR FreeRTOS functions will be placed into Flash memory instead of IRAM. + This saves up to 8KB of IRAM depending on which functions are used. + config FREERTOS_DEBUG_OCDAWARE bool help diff --git a/components/freertos/linker.lf b/components/freertos/linker.lf index 0917c52171..a45fc9e4e0 100644 --- a/components/freertos/linker.lf +++ b/components/freertos/linker.lf @@ -3,4 +3,112 @@ archive: libfreertos.a entries: * (noflash_text) queue:xQueueGenericCreateStatic (default) - + if FREERTOS_PLACE_FUNCTIONS_INTO_FLASH = y: + port: pxPortInitialiseStack (default) + port: xPortStartScheduler (default) + port: vPortStoreTaskMPUSettings (default) + port: vPortReleaseTaskMPUSettings (default) + if ESP_PANIC_HANDLER_IRAM != y: + tasks: uxTaskGetSnapshotAll (default) + tasks: prvTaskGetSnapshot (default) + tasks: prvTaskGetSnapshotsFromList (default) + tasks: prvTaskCheckFreeStackSpace (default) + tasks: prvListTaskWithinSingleList (default) + tasks: prvInitialiseNewTask (default) + tasks: prvInitialiseTaskLists (default) + tasks: prvDeleteTCB (default) + tasks: prvCheckTasksWaitingTermination (default) + tasks: prvAddCurrentTaskToDelayedList (default) + tasks: prvIdleTask (default) + tasks: prvAddNewTaskToReadyList (default) + tasks: xTaskCreateStaticPinnedToCore (default) + tasks: xTaskCreatePinnedToCore (default) + tasks: vTaskResume (default) + tasks: vTaskStartScheduler (default) + tasks: vTaskSuspendAll (default) + tasks: uxTaskGetNumberOfTasks (default) + tasks: uxTaskGetSystemState (default) + tasks: xTaskGetIdleTaskHandle (default) + tasks: xTaskRemoveFromUnorderedEventList (default) + tasks: uxTaskGetTaskNumber (default) + tasks: vTaskSetTaskNumber (default) + tasks: uxTaskPriorityGet (default) + tasks: vTaskPrioritySet (default) + tasks: vTaskSetThreadLocalStoragePointerAndDelCallback (default) + tasks: pvTaskGetThreadLocalStoragePointer (default) + tasks: xTaskGetCurrentTaskHandleForCPU (default) + tasks: vTaskDelete (default) + tasks: vTaskDelayUntil (default) + tasks: vTaskDelay (default) + tasks: vTaskSuspend (default) + tasks: xTaskResumeAll (default) + tasks: uxTaskResetEventItemValue (default) + tasks: ulTaskNotifyTake (default) + tasks: xTaskNotifyWait (default) + tasks: xTaskNotify (default) + tasks: eTaskGetState (default) + tasks: pxTaskGetStackStart (default) + tasks: uxTaskGetStackHighWaterMark (default) + tasks: vTaskAllocateMPURegions (default) + tasks: vTaskEndScheduler (default) + tasks: vTaskList (default) + tasks: vTaskMissedYield (default) + tasks: vTaskSetThreadLocalStoragePointer (default) + tasks: xTaskCreateRestricted (default) + tasks: xTaskGetAffinity (default) + tasks: xTaskGetIdleTaskHandleForCPU (default) + timers: prvInsertTimerInActiveList (default) + timers: prvCheckForValidListAndQueue (default) + timers: prvInitialiseNewTimer (default) + timers: prvTimerTask (default) + timers: prvSwitchTimerLists (default) + timers: prvSampleTimeNow (default) + timers: prvProcessExpiredTimer (default) + timers: prvProcessTimerOrBlockTask (default) + timers: prvProcessReceivedCommands (default) + timers: xTimerCreateTimerTask (default) + timers: xTimerCreate (default) + timers: xTimerCreateStatic (default) + timers: xTimerGenericCommand (default) + timers: xTimerGetPeriod (default) + timers: xTimerGetExpiryTime (default) + timers: xTimerIsTimerActive (default) + timers: pvTimerGetTimerID (default) + timers: vTimerSetTimerID (default) + timers: prvGetNextExpireTime (default) + event_groups: prvTestWaitCondition (default) + event_groups: xEventGroupCreateStatic (default) + event_groups: xEventGroupCreate (default) + event_groups: xEventGroupWaitBits (default) + event_groups: xEventGroupClearBits (default) + event_groups: xEventGroupSetBits (default) + event_groups: xEventGroupSync (default) + event_groups: vEventGroupDelete (default) + queue: prvIsQueueEmpty (default) + queue: prvIsQueueFull (default) + queue: prvInitialiseNewQueue (default) + queue: prvInitialiseMutex (default) + queue: uxQueueSpacesAvailable (default) + queue: xQueueGenericReset (default) + queue: xQueueGenericCreate (default) + queue: xQueueGetMutexHolder (default) + queue: xQueueCreateCountingSemaphoreStatic (default) + queue: xQueueCreateCountingSemaphore (default) + queue: xQueueGenericSend (default) + queue: xQueueCreateMutex (default) + queue: xQueueCreateMutexStatic (default) + queue: xQueueGiveMutexRecursive (default) + queue: xQueueTakeMutexRecursive (default) + queue: uxQueueMessagesWaiting (default) + queue: uxQueueGetQueueNumber (default) + queue: vQueueSetQueueNumber (default) + queue: ucQueueGetQueueType (default) + queue: vQueueAddToRegistry (default) + queue: pcQueueGetName (default) + queue: vQueueUnregisterQueue (default) + queue: vQueueDelete (default) + queue: vQueueWaitForMessageRestricted (default) + queue: xQueueCreateSet (default) + queue: xQueueAddToSet (default) + queue: xQueueRemoveFromSet (default) + queue: xQueueSelectFromSet (default) diff --git a/components/freertos/test/test_preemption.c b/components/freertos/test/test_preemption.c index 98668abb86..9eeafa990c 100644 --- a/components/freertos/test/test_preemption.c +++ b/components/freertos/test/test_preemption.c @@ -13,6 +13,7 @@ #include "unity.h" #include "soc/cpu.h" #include "test_utils.h" +#include "sdkconfig.h" static volatile bool trigger; static volatile bool flag; @@ -72,7 +73,7 @@ TEST_CASE("Yield from lower priority task, same CPU", "[freertos]") } -#if portNUM_PROCESSORS == 2 +#if (portNUM_PROCESSORS == 2) && !CONFIG_FREERTOS_TASK_FUNCTIONS_INTO_FLASH TEST_CASE("Yield from lower priority task, other CPU", "[freertos]") { uint32_t trigger_ccount, yield_ccount, now_ccount, delta; @@ -107,4 +108,4 @@ TEST_CASE("Yield from lower priority task, other CPU", "[freertos]") vTaskDelete(sender_task); } } -#endif // portNUM_PROCESSORS == 2 +#endif diff --git a/tools/ci/config/target-test.yml b/tools/ci/config/target-test.yml index 98096ed223..413e94572c 100644 --- a/tools/ci/config/target-test.yml +++ b/tools/ci/config/target-test.yml @@ -398,7 +398,7 @@ test_app_test_003: UT_001: extends: .unit_test_template - parallel: 39 + parallel: 43 tags: - ESP32_IDF - UT_T1_1 @@ -407,7 +407,7 @@ UT_001: UT_002: extends: .unit_test_template - parallel: 15 + parallel: 12 tags: - ESP32_IDF - UT_T1_1 @@ -481,7 +481,7 @@ UT_017: UT_018: extends: .unit_test_template - parallel: 5 + parallel: 2 tags: - ESP32_IDF - UT_T1_1 @@ -537,6 +537,7 @@ UT_033: UT_034: extends: .unit_test_template + parallel: 2 tags: - ESP32_IDF - UT_T1_ESP_FLASH @@ -560,7 +561,7 @@ UT_034: UT_035: extends: .unit_test_s2_template - parallel: 38 + parallel: 41 tags: - ESP32S2_IDF - UT_T1_1 @@ -612,7 +613,12 @@ UT_045: - ESP32_IDF - UT_SDIO - psram - + +UT_046: + extends: .unit_test_template + tags: + - ESP32_IDF + - UT_T1_GPIO nvs_compatible_test: extends: .test_template diff --git a/tools/ldgen/generation.py b/tools/ldgen/generation.py index 60285849aa..e624a92d04 100644 --- a/tools/ldgen/generation.py +++ b/tools/ldgen/generation.py @@ -80,8 +80,7 @@ class PlacementRule(): def do_section_expansion(rule, section): if section in rule.get_section_names(): sections_in_obj = sections_infos.get_obj_sections(rule.archive, rule.obj) - - expansions = fnmatch.filter(sections_in_obj, section) + expansions = [n for n in sections_in_obj or [] if fnmatch.fnmatch(n, section)] return expansions def remove_section_expansions(rule, section, expansions): diff --git a/tools/unit-test-app/configs/freertos_flash b/tools/unit-test-app/configs/freertos_flash new file mode 100644 index 0000000000..2b8e3427f8 --- /dev/null +++ b/tools/unit-test-app/configs/freertos_flash @@ -0,0 +1,2 @@ +TEST_COMPONENTS=freertos driver spi_flash +CONFIG_FREERTOS_TASK_FUNCTIONS_INTO_FLASH=y