mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
esp_system: introduce intermediary function to call after system init
This MR uses an intermediary function `start_app` to call after system initialization instead of `app_main`. In RTOS builds, freertos provides `start_app` and calls `app_main`. In non-RTOS builds, user provides `start_app` directly.
This commit is contained in:
parent
08cbfa6187
commit
98dc1b0188
@ -8,9 +8,12 @@ idf_component_register(SRCS "panic.c" "system_api.c" "startup.c"
|
||||
|
||||
add_subdirectory(port)
|
||||
|
||||
# Rely on user code to define app_main
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u app_main")
|
||||
# After system initialization, `start_app` (and its other cores variant) is called.
|
||||
# This is provided by the user or from another component. Since we can't establish
|
||||
# dependency on what we don't know, force linker to not drop the symbol regardless
|
||||
# of link line order.
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u start_app")
|
||||
|
||||
if (NOT CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE)
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u app_mainX")
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u start_app_other_cores")
|
||||
endif()
|
@ -77,23 +77,23 @@
|
||||
#define STRINGIFY2(s) #s
|
||||
|
||||
// App entry point for core 0
|
||||
extern void app_main(void);
|
||||
extern void start_app(void);
|
||||
|
||||
// Entry point for core 0 from hardware init (port layer)
|
||||
void start_cpu0(void) __attribute__((weak, alias("start_cpu0_default"))) __attribute__((noreturn));
|
||||
|
||||
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||
// Entry point for core [1..X] from hardware init (port layer)
|
||||
void start_cpuX(void) __attribute__((weak, alias("start_cpuX_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]
|
||||
void app_mainX(void) __attribute__((weak, alias("app_mainX_default"))) __attribute__((noreturn));
|
||||
void start_app_other_cores(void) __attribute__((weak, alias("start_app_other_cores_default"))) __attribute__((noreturn));
|
||||
|
||||
static volatile bool s_system_inited[SOC_CPU_CORES_NUM] = { false };
|
||||
|
||||
sys_startup_fn_t g_startup_fn[SOC_CPU_CORES_NUM] = { [0] = start_cpu0,
|
||||
#if SOC_CPU_CORES_NUM > 1
|
||||
[1 ... SOC_CPU_CORES_NUM - 1] = start_cpuX
|
||||
[1 ... SOC_CPU_CORES_NUM - 1] = start_cpu_other_cores
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -143,14 +143,14 @@ static void IRAM_ATTR do_system_init_fn(void)
|
||||
}
|
||||
|
||||
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||
static void IRAM_ATTR app_mainX_default(void)
|
||||
static void IRAM_ATTR start_app_other_cores_default(void)
|
||||
{
|
||||
while (1) {
|
||||
ets_delay_us(UINT32_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
static void IRAM_ATTR start_cpuX_default(void)
|
||||
static void IRAM_ATTR start_cpu_other_cores_default(void)
|
||||
{
|
||||
do_system_init_fn();
|
||||
|
||||
@ -158,7 +158,7 @@ static void IRAM_ATTR start_cpuX_default(void)
|
||||
ets_delay_us(100);
|
||||
}
|
||||
|
||||
app_mainX();
|
||||
start_app_other_cores();
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -331,7 +331,7 @@ void IRAM_ATTR start_cpu0_default(void)
|
||||
s_system_full_inited = true;
|
||||
#endif
|
||||
|
||||
app_main();
|
||||
start_app();
|
||||
while (1);
|
||||
}
|
||||
|
||||
|
@ -63,4 +63,10 @@ set_source_files_properties(
|
||||
_ESP_FREERTOS_INTERNAL
|
||||
)
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-Wl,--wrap=app_main")
|
||||
# The freertos component provides the `start_app` and `start_app_other_cores`
|
||||
# if it is included in the build. It then calls `app_main`
|
||||
# from the main task created, which must be provided by the user.
|
||||
# Like for `start_app` and `start_app_other_cores`,
|
||||
# we can't establish dependency on what we don't yet know, so we force the
|
||||
# linker to not drop this symbol.
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u app_main")
|
@ -138,6 +138,8 @@ extern void _frxt_tick_timer_init(void);
|
||||
/* Defined in xtensa_context.S */
|
||||
extern void _xt_coproc_init(void);
|
||||
|
||||
extern void app_main(void);
|
||||
|
||||
static const char* TAG = "cpu_start"; // [refactor-todo]: might be appropriate to change in the future, but
|
||||
// for now maintain the same log output
|
||||
|
||||
@ -460,15 +462,6 @@ void __attribute__((weak)) vApplicationStackOverflowHook( TaskHandle_t xTask, c
|
||||
esp_system_abort(buf);
|
||||
}
|
||||
|
||||
// `esp_system` calls the app entry point app_main for core 0 and app_mainX for
|
||||
// the rest of the cores which the app normally provides for non-os builds.
|
||||
// If `freertos` is included in the build, wrap the call to app_main and provide
|
||||
// our own definition of app_mainX so that we can do our own initializations for each
|
||||
// core and start the scheduler.
|
||||
//
|
||||
// We now simply execute the real app_main in the context of the main task that
|
||||
// we also start.
|
||||
extern void __real_app_main(void);
|
||||
|
||||
static void main_task(void* args)
|
||||
{
|
||||
@ -515,7 +508,7 @@ static void main_task(void* args)
|
||||
}
|
||||
#endif
|
||||
|
||||
__real_app_main();
|
||||
app_main();
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
@ -530,7 +523,7 @@ static void main_task(void* args)
|
||||
|
||||
|
||||
#if !CONFIG_FREERTOS_UNICORE
|
||||
void app_mainX(void)
|
||||
void start_app_other_cores(void)
|
||||
{
|
||||
// For now, we only support up to two core: 0 and 1.
|
||||
if (xPortGetCoreID() >= 2) {
|
||||
@ -562,7 +555,7 @@ void app_mainX(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void __wrap_app_main(void)
|
||||
void start_app(void)
|
||||
{
|
||||
#if CONFIG_ESP_INT_WDT
|
||||
esp_int_wdt_init();
|
||||
|
Loading…
x
Reference in New Issue
Block a user