Merge branch 'feature/freertos_port_code_out_iram' into 'master'

feature/esp_system: move startup and freertos port  once-time code out of IRAM when possible

Closes IDF-1975

See merge request espressif/esp-idf!9976
This commit is contained in:
Ivan Grokhotkov
2020-09-17 06:58:08 +08:00
4 changed files with 17 additions and 15 deletions

View File

@@ -4,7 +4,6 @@ entries:
panic (noflash) panic (noflash)
panic_handler (noflash) panic_handler (noflash)
reset_reason (noflash) reset_reason (noflash)
system_api:esp_system_abort (noflash)
if ESP_CONSOLE_USB_CDC_SUPPORT_ETS_PRINTF: if ESP_CONSOLE_USB_CDC_SUPPORT_ETS_PRINTF:
usb_console:esp_usb_console_write_char (noflash) usb_console:esp_usb_console_write_char (noflash)

View File

@@ -81,7 +81,7 @@
uint64_t g_startup_time = 0; uint64_t g_startup_time = 0;
// App entry point for core 0 // App entry point for core 0
extern void start_app(void); extern void esp_startup_start_app(void);
// Entry point for core 0 from hardware init (port layer) // Entry point for core 0 from hardware init (port layer)
void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attribute__((noreturn)); void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attribute__((noreturn));
@@ -91,7 +91,7 @@ void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attri
void start_cpu_other_cores(void) __attribute__((weak, alias("start_cpu_other_cores_default"))) __attribute__((noreturn)); void start_cpu_other_cores(void) __attribute__((weak, alias("start_cpu_other_cores_default"))) __attribute__((noreturn));
// App entry point for core [1..X] // App entry point for core [1..X]
void start_app_other_cores(void) __attribute__((weak, alias("start_app_other_cores_default"))) __attribute__((noreturn)); void esp_startup_start_app_other_cores(void) __attribute__((weak, alias("esp_startup_start_app_other_cores_default"))) __attribute__((noreturn));
static volatile bool s_system_inited[SOC_CPU_CORES_NUM] = { false }; static volatile bool s_system_inited[SOC_CPU_CORES_NUM] = { false };
@@ -120,7 +120,7 @@ static IRAM_ATTR void _Unwind_SetNoFunctionContextInstall_Default(unsigned char
static const char* TAG = "cpu_start"; static const char* TAG = "cpu_start";
static void IRAM_ATTR do_global_ctors(void) static void do_global_ctors(void)
{ {
extern void (*__init_array_start)(void); extern void (*__init_array_start)(void);
extern void (*__init_array_end)(void); extern void (*__init_array_end)(void);
@@ -140,7 +140,7 @@ static void IRAM_ATTR do_global_ctors(void)
} }
} }
static void IRAM_ATTR do_system_init_fn(void) static void do_system_init_fn(void)
{ {
extern esp_system_init_fn_t _esp_system_init_fn_array_start; extern esp_system_init_fn_t _esp_system_init_fn_array_start;
extern esp_system_init_fn_t _esp_system_init_fn_array_end; extern esp_system_init_fn_t _esp_system_init_fn_array_end;
@@ -159,14 +159,14 @@ static void IRAM_ATTR do_system_init_fn(void)
} }
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE #if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
static void IRAM_ATTR start_app_other_cores_default(void) static void esp_startup_start_app_other_cores_default(void)
{ {
while (1) { while (1) {
esp_rom_delay_us(UINT32_MAX); esp_rom_delay_us(UINT32_MAX);
} }
} }
static void IRAM_ATTR start_cpu_other_cores_default(void) static void start_cpu_other_cores_default(void)
{ {
do_system_init_fn(); do_system_init_fn();
@@ -174,11 +174,11 @@ static void IRAM_ATTR start_cpu_other_cores_default(void)
esp_rom_delay_us(100); esp_rom_delay_us(100);
} }
start_app_other_cores(); esp_startup_start_app_other_cores();
} }
#endif #endif
static void IRAM_ATTR do_core_init(void) static void do_core_init(void)
{ {
/* Initialize heap allocator. WARNING: This *needs* to happen *after* the app cpu has booted. /* Initialize heap allocator. WARNING: This *needs* to happen *after* the app cpu has booted.
If the heap allocator is initialized first, it will put free memory linked list items into If the heap allocator is initialized first, it will put free memory linked list items into
@@ -277,7 +277,7 @@ static void IRAM_ATTR do_core_init(void)
assert(flash_ret == ESP_OK); assert(flash_ret == ESP_OK);
} }
static void IRAM_ATTR do_secondary_init(void) static void do_secondary_init(void)
{ {
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE #if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
// The port layer transferred control to this function with other cores 'paused', // The port layer transferred control to this function with other cores 'paused',
@@ -304,7 +304,7 @@ static void IRAM_ATTR do_secondary_init(void)
#endif #endif
} }
void IRAM_ATTR start_cpu0_default(void) static void start_cpu0_default(void)
{ {
ESP_EARLY_LOGI(TAG, "Pro cpu start user code"); ESP_EARLY_LOGI(TAG, "Pro cpu start user code");
@@ -353,7 +353,7 @@ void IRAM_ATTR start_cpu0_default(void)
s_system_full_inited = true; s_system_full_inited = true;
#endif #endif
start_app(); esp_startup_start_app();
while (1); while (1);
} }

View File

@@ -112,3 +112,6 @@ entries:
queue: xQueueAddToSet (default) queue: xQueueAddToSet (default)
queue: xQueueRemoveFromSet (default) queue: xQueueRemoveFromSet (default)
queue: xQueueSelectFromSet (default) queue: xQueueSelectFromSet (default)
port:main_task (default)
port:esp_startup_start_app (default)
port:esp_startup_start_app_other_cores (default)

View File

@@ -547,7 +547,7 @@ static void main_task(void* args)
#if !CONFIG_FREERTOS_UNICORE #if !CONFIG_FREERTOS_UNICORE
void start_app_other_cores(void) void esp_startup_start_app_other_cores(void)
{ {
// For now, we only support up to two core: 0 and 1. // For now, we only support up to two core: 0 and 1.
if (xPortGetCoreID() >= 2) { if (xPortGetCoreID() >= 2) {
@@ -581,7 +581,7 @@ void start_app_other_cores(void)
} }
#endif #endif
void start_app(void) void esp_startup_start_app(void)
{ {
#if CONFIG_ESP_INT_WDT #if CONFIG_ESP_INT_WDT
esp_int_wdt_init(); esp_int_wdt_init();