Merge branch 'bugfix/fix_iram_intr_alloc_test' into 'master'
ccomp_timer: fix broken unit test See merge request espressif/esp-idf!6779
This commit is contained in:
commit
ea29c101cd
|
@ -214,15 +214,15 @@ TEST_CASE("Can allocate IRAM int only with an IRAM handler", "[esp32]")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
intr_handle_t ih;
|
intr_handle_t ih;
|
||||||
esp_err_t err = esp_intr_alloc(ETS_INTERNAL_PROFILING_INTR_SOURCE,
|
esp_err_t err = esp_intr_alloc(ETS_INTERNAL_SW0_INTR_SOURCE,
|
||||||
ESP_INTR_FLAG_IRAM, &dummy, NULL, &ih);
|
ESP_INTR_FLAG_IRAM, &dummy, NULL, &ih);
|
||||||
TEST_ASSERT_EQUAL_INT(ESP_ERR_INVALID_ARG, err);
|
TEST_ASSERT_EQUAL_INT(ESP_ERR_INVALID_ARG, err);
|
||||||
err = esp_intr_alloc(ETS_INTERNAL_PROFILING_INTR_SOURCE,
|
err = esp_intr_alloc(ETS_INTERNAL_SW0_INTR_SOURCE,
|
||||||
ESP_INTR_FLAG_IRAM, &dummy_iram, NULL, &ih);
|
ESP_INTR_FLAG_IRAM, &dummy_iram, NULL, &ih);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
err = esp_intr_free(ih);
|
err = esp_intr_free(ih);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
err = esp_intr_alloc(ETS_INTERNAL_PROFILING_INTR_SOURCE,
|
err = esp_intr_alloc(ETS_INTERNAL_SW0_INTR_SOURCE,
|
||||||
ESP_INTR_FLAG_IRAM, &dummy_rtc, NULL, &ih);
|
ESP_INTR_FLAG_IRAM, &dummy_rtc, NULL, &ih);
|
||||||
TEST_ESP_OK(err);
|
TEST_ESP_OK(err);
|
||||||
err = esp_intr_free(ih);
|
err = esp_intr_free(ih);
|
||||||
|
|
|
@ -126,29 +126,17 @@ static void set_perfmon_interrupt(bool enable)
|
||||||
eri_write(ERI_PERFMON_PMCTRL0 + I_STALL_COUNTER_ID * sizeof(int32_t), i_pmctrl);
|
eri_write(ERI_PERFMON_PMCTRL0 + I_STALL_COUNTER_ID * sizeof(int32_t), i_pmctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intr_alloc(void* params)
|
|
||||||
{
|
|
||||||
int *id = (int*) params;
|
|
||||||
// Keep track of how many times each counter has overflowed.
|
|
||||||
esp_intr_alloc(ETS_INTERNAL_PROFILING_INTR_SOURCE, 0,
|
|
||||||
perf_counter_overflow_handler, NULL, &s_status[*id].intr_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Linker seems to be smart enough to drop this if ccomp_timer APIs are not used.
|
|
||||||
static __attribute__((constructor)) void ccomp_timer_impl_start_init(void)
|
|
||||||
{
|
|
||||||
#if !CONFIG_FREERTOS_UNICORE
|
|
||||||
for (int i = 0; i < portNUM_PROCESSORS; i++) {
|
|
||||||
esp_ipc_call_blocking(i, intr_alloc, &i);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int i = 0;
|
|
||||||
intr_alloc(&i);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t ccomp_timer_impl_init(void)
|
esp_err_t ccomp_timer_impl_init(void)
|
||||||
{
|
{
|
||||||
|
// Keep track of how many times each counter has overflowed.
|
||||||
|
esp_err_t err = esp_intr_alloc(ETS_INTERNAL_PROFILING_INTR_SOURCE, 0,
|
||||||
|
perf_counter_overflow_handler, NULL, &s_status[xPortGetCoreID()].intr_handle);
|
||||||
|
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
xtensa_perfmon_init(D_STALL_COUNTER_ID,
|
xtensa_perfmon_init(D_STALL_COUNTER_ID,
|
||||||
XTPERF_CNT_D_STALL,
|
XTPERF_CNT_D_STALL,
|
||||||
XTPERF_MASK_D_STALL_BUSY, 0, -1);
|
XTPERF_MASK_D_STALL_BUSY, 0, -1);
|
||||||
|
@ -164,6 +152,13 @@ esp_err_t ccomp_timer_impl_init(void)
|
||||||
esp_err_t ccomp_timer_impl_deinit(void)
|
esp_err_t ccomp_timer_impl_deinit(void)
|
||||||
{
|
{
|
||||||
set_perfmon_interrupt(false);
|
set_perfmon_interrupt(false);
|
||||||
|
|
||||||
|
esp_err_t err = esp_intr_free(s_status[xPortGetCoreID()].intr_handle);
|
||||||
|
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
s_status[xPortGetCoreID()].intr_handle = NULL;
|
s_status[xPortGetCoreID()].intr_handle = NULL;
|
||||||
s_status[xPortGetCoreID()].state = PERF_TIMER_UNINIT;
|
s_status[xPortGetCoreID()].state = PERF_TIMER_UNINIT;
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
|
|
Loading…
Reference in a new issue