esp_timer: Adds AFFINITY options for task and ISR
These new settings allow you to balance the load on cores. Closes: https://github.com/espressif/esp-idf/issues/10457
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -1177,4 +1177,43 @@ TEST_CASE("Test ESP_TIMER_ISR, stop API cleans alarm reg if ISR timer list is em
|
||||
vSemaphoreDelete(done);
|
||||
printf("timer deleted\n");
|
||||
}
|
||||
|
||||
#ifndef CONFIG_FREERTOS_UNICORE
|
||||
static void task_callback3(void* arg)
|
||||
{
|
||||
int *data = (int *)arg;
|
||||
++*data;
|
||||
esp_rom_printf("callback from CPU%d\n", xPortGetCoreID());
|
||||
#if defined(CONFIG_ESP_TIMER_ISR_AFFINITY_NO_AFFINITY) || defined(CONFIG_ESP_TIMER_ISR_AFFINITY_CPU1)
|
||||
TEST_ASSERT_EQUAL_INT(1, xPortGetCoreID());
|
||||
#endif // CONFIG_ESP_TIMER_AFFINITY_NO_AFFINITY
|
||||
}
|
||||
|
||||
TEST_CASE("Test that CPU1 can handle esp_timer ISR even when CPU0 is blocked", "[esp_timer][isr_dispatch]")
|
||||
{
|
||||
int data = 0;
|
||||
|
||||
esp_timer_handle_t timer;
|
||||
const esp_timer_create_args_t timer_args = {
|
||||
.callback = &task_callback3,
|
||||
.dispatch_method = ESP_TIMER_ISR,
|
||||
.arg = &data,
|
||||
.name = "test",
|
||||
};
|
||||
TEST_ESP_OK(esp_timer_create(&timer_args, &timer));
|
||||
TEST_ESP_OK(esp_timer_start_periodic(timer, 10000));
|
||||
|
||||
portDISABLE_INTERRUPTS();
|
||||
TEST_ASSERT_EQUAL_INT(0, xPortGetCoreID());
|
||||
esp_rom_printf("CPU%d is blocked\n", xPortGetCoreID());
|
||||
esp_rom_delay_us(100000);
|
||||
esp_rom_printf("CPU%d is released\n", xPortGetCoreID());
|
||||
portENABLE_INTERRUPTS();
|
||||
|
||||
TEST_ESP_OK(esp_timer_stop(timer));
|
||||
TEST_ESP_OK(esp_timer_dump(stdout));
|
||||
TEST_ASSERT_INT_WITHIN(3, 10, data);
|
||||
TEST_ESP_OK(esp_timer_delete(timer));
|
||||
}
|
||||
#endif // not CONFIG_FREERTOS_UNICORE
|
||||
#endif // CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD
|
||||
|
||||
@@ -10,6 +10,10 @@ CONFIGS = [
|
||||
pytest.param('single_core', marks=[pytest.mark.esp32]),
|
||||
pytest.param('freertos_compliance', marks=[pytest.mark.esp32]),
|
||||
pytest.param('isr_dispatch_esp32', marks=[pytest.mark.esp32]),
|
||||
pytest.param('cpu1_esp32', marks=[pytest.mark.esp32]),
|
||||
pytest.param('any_cpu_esp32', marks=[pytest.mark.esp32]),
|
||||
pytest.param('cpu1_esp32s3', marks=[pytest.mark.esp32s3]),
|
||||
pytest.param('any_cpu_esp32s3', marks=[pytest.mark.esp32s3]),
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
CONFIG_IDF_TARGET="esp32"
|
||||
CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
|
||||
CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL=y
|
||||
CONFIG_ESP_TIMER_TASK_AFFINITY_NO_AFFINITY=y
|
||||
CONFIG_ESP_TIMER_ISR_AFFINITY_NO_AFFINITY=y
|
||||
@@ -0,0 +1,5 @@
|
||||
CONFIG_IDF_TARGET="esp32s3"
|
||||
CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
|
||||
CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL=y
|
||||
CONFIG_ESP_TIMER_TASK_AFFINITY_NO_AFFINITY=y
|
||||
CONFIG_ESP_TIMER_ISR_AFFINITY_NO_AFFINITY=y
|
||||
@@ -0,0 +1,5 @@
|
||||
CONFIG_IDF_TARGET="esp32"
|
||||
CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
|
||||
CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL=y
|
||||
CONFIG_ESP_TIMER_TASK_AFFINITY_CPU1=y
|
||||
CONFIG_ESP_TIMER_ISR_AFFINITY_CPU1=y
|
||||
@@ -0,0 +1,5 @@
|
||||
CONFIG_IDF_TARGET="esp32s3"
|
||||
CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
|
||||
CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL=y
|
||||
CONFIG_ESP_TIMER_TASK_AFFINITY_CPU1=y
|
||||
CONFIG_ESP_TIMER_ISR_AFFINITY_CPU1=y
|
||||
Reference in New Issue
Block a user