esp32: exclude DPORT-related code in single core mode

This commit is contained in:
Ivan Grokhotkov 2017-09-22 11:54:51 +08:00
parent 022d949ccf
commit 6b61c6d39f
2 changed files with 17 additions and 9 deletions

View file

@ -41,6 +41,7 @@
#include "xtensa/core-macros.h" #include "xtensa/core-macros.h"
#ifndef CONFIG_FREERTOS_UNICORE
static portMUX_TYPE g_dport_mux = portMUX_INITIALIZER_UNLOCKED; static portMUX_TYPE g_dport_mux = portMUX_INITIALIZER_UNLOCKED;
#define DPORT_CORE_STATE_IDLE 0 #define DPORT_CORE_STATE_IDLE 0
@ -61,9 +62,9 @@ static uint32_t ccount_margin[portNUM_PROCESSORS][DPORT_ACCESS_BENCHMARK_STORE_N
static uint32_t ccount_margin_cnt; static uint32_t ccount_margin_cnt;
#endif #endif
#ifndef CONFIG_FREERTOS_UNICORE
static BaseType_t oldInterruptLevel[2]; static BaseType_t oldInterruptLevel[2];
#endif #endif // CONFIG_FREERTOS_UNICORE
/* stall other cpu that this cpu is pending to access dport register start */ /* stall other cpu that this cpu is pending to access dport register start */
void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void) void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void)
@ -153,17 +154,17 @@ void IRAM_ATTR esp_dport_access_stall_other_cpu_end_wrap(void)
DPORT_STALL_OTHER_CPU_END(); DPORT_STALL_OTHER_CPU_END();
} }
#ifndef CONFIG_FREERTOS_UNICORE
static void dport_access_init_core(void *arg) static void dport_access_init_core(void *arg)
{ {
int core_id = 0; int core_id = 0;
uint32_t intr_source = ETS_FROM_CPU_INTR2_SOURCE; uint32_t intr_source = ETS_FROM_CPU_INTR2_SOURCE;
#ifndef CONFIG_FREERTOS_UNICORE
core_id = xPortGetCoreID(); core_id = xPortGetCoreID();
if (core_id == 1) { if (core_id == 1) {
intr_source = ETS_FROM_CPU_INTR3_SOURCE; intr_source = ETS_FROM_CPU_INTR3_SOURCE;
} }
#endif
ESP_INTR_DISABLE(ETS_DPORT_INUM); ESP_INTR_DISABLE(ETS_DPORT_INUM);
intr_matrix_set(core_id, intr_source, ETS_DPORT_INUM); intr_matrix_set(core_id, intr_source, ETS_DPORT_INUM);
@ -176,40 +177,43 @@ static void dport_access_init_core(void *arg)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
#endif
/* Defer initialisation until after scheduler is running */ /* Defer initialisation until after scheduler is running */
void esp_dport_access_int_init(void) void esp_dport_access_int_init(void)
{ {
#ifndef CONFIG_FREERTOS_UNICORE
portBASE_TYPE res = xTaskCreatePinnedToCore(&dport_access_init_core, "dport", configMINIMAL_STACK_SIZE, NULL, 5, NULL, xPortGetCoreID()); portBASE_TYPE res = xTaskCreatePinnedToCore(&dport_access_init_core, "dport", configMINIMAL_STACK_SIZE, NULL, 5, NULL, xPortGetCoreID());
assert(res == pdTRUE); assert(res == pdTRUE);
#endif
} }
void IRAM_ATTR esp_dport_access_int_pause(void) void IRAM_ATTR esp_dport_access_int_pause(void)
{ {
#ifndef CONFIG_FREERTOS_UNICORE
portENTER_CRITICAL_ISR(&g_dport_mux); portENTER_CRITICAL_ISR(&g_dport_mux);
dport_core_state[0] = DPORT_CORE_STATE_IDLE; dport_core_state[0] = DPORT_CORE_STATE_IDLE;
#ifndef CONFIG_FREERTOS_UNICORE
dport_core_state[1] = DPORT_CORE_STATE_IDLE; dport_core_state[1] = DPORT_CORE_STATE_IDLE;
#endif
portEXIT_CRITICAL_ISR(&g_dport_mux); portEXIT_CRITICAL_ISR(&g_dport_mux);
#endif
} }
//Used in panic code: the enter_critical stuff may be messed up so we just stop everything without checking the mux. //Used in panic code: the enter_critical stuff may be messed up so we just stop everything without checking the mux.
void IRAM_ATTR esp_dport_access_int_abort(void) void IRAM_ATTR esp_dport_access_int_abort(void)
{ {
dport_core_state[0] = DPORT_CORE_STATE_IDLE;
#ifndef CONFIG_FREERTOS_UNICORE #ifndef CONFIG_FREERTOS_UNICORE
dport_core_state[0] = DPORT_CORE_STATE_IDLE;
dport_core_state[1] = DPORT_CORE_STATE_IDLE; dport_core_state[1] = DPORT_CORE_STATE_IDLE;
#endif #endif
} }
void IRAM_ATTR esp_dport_access_int_resume(void) void IRAM_ATTR esp_dport_access_int_resume(void)
{ {
#ifndef CONFIG_FREERTOS_UNICORE
portENTER_CRITICAL_ISR(&g_dport_mux); portENTER_CRITICAL_ISR(&g_dport_mux);
dport_core_state[0] = DPORT_CORE_STATE_RUNNING; dport_core_state[0] = DPORT_CORE_STATE_RUNNING;
#ifndef CONFIG_FREERTOS_UNICORE
dport_core_state[1] = DPORT_CORE_STATE_RUNNING; dport_core_state[1] = DPORT_CORE_STATE_RUNNING;
#endif
portEXIT_CRITICAL_ISR(&g_dport_mux); portEXIT_CRITICAL_ISR(&g_dport_mux);
#endif
} }

View file

@ -45,10 +45,12 @@ _l4_intr_stack:
.align 4 .align 4
xt_highint4: xt_highint4:
#ifndef CONFIG_FREERTOS_UNICORE
/* See if we're here for the dport access interrupt */ /* See if we're here for the dport access interrupt */
rsr a0, INTERRUPT rsr a0, INTERRUPT
extui a0, a0, ETS_DPORT_INUM, 1 extui a0, a0, ETS_DPORT_INUM, 1
bnez a0, .handle_dport_access_int bnez a0, .handle_dport_access_int
#endif // CONFIG_FREERTOS_UNICORE
/* Allocate exception frame and save minimal context. */ /* Allocate exception frame and save minimal context. */
mov a0, sp mov a0, sp
@ -129,6 +131,7 @@ xt_highint4:
#ifndef CONFIG_FREERTOS_UNICORE
.align 4 .align 4
.handle_dport_access_int: .handle_dport_access_int:
@ -187,6 +190,7 @@ xt_highint4:
rsr a0, EXCSAVE_4 /* restore a0 */ rsr a0, EXCSAVE_4 /* restore a0 */
rfi 4 rfi 4
#endif // CONFIG_FREERTOS_UNICORE
/* The linker has no reason to link in this file; all symbols it exports are already defined /* The linker has no reason to link in this file; all symbols it exports are already defined
(weakly!) in the default int handler. Define a symbol here so we can use it to have the (weakly!) in the default int handler. Define a symbol here so we can use it to have the