esp_timer: Add a Kconfig option to configure the interrupt level

This commit is contained in:
KonstantinKondrashov
2020-02-10 19:56:04 +08:00
parent 3c6c5b8a29
commit bcbee89030
4 changed files with 15 additions and 3 deletions

View File

@@ -32,6 +32,15 @@ menu "High resolution timer (esp_timer)"
FreeRTOS timer task size, see "FreeRTOS timer task stack size" option FreeRTOS timer task size, see "FreeRTOS timer task stack size" option
in "FreeRTOS" menu. in "FreeRTOS" menu.
config ESP_TIMER_INTERRUPT_LEVEL
int "Interrupt level"
default 1
range 1 3 if IDF_TARGET_ESP32
range 1 1 if !IDF_TARGET_ESP32
help
It sets the interrupt level for esp_timer ISR in range 1..3.
A higher level (3) helps to decrease the ISR esp_timer latency.
choice ESP_TIMER_IMPL choice ESP_TIMER_IMPL
prompt "Hardware timer to use for esp_timer" prompt "Hardware timer to use for esp_timer"
default ESP_TIMER_IMPL_TG0_LAC if IDF_TARGET_ESP32 default ESP_TIMER_IMPL_TG0_LAC if IDF_TARGET_ESP32

View File

@@ -360,8 +360,9 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
{ {
s_alarm_handler = alarm_handler; s_alarm_handler = alarm_handler;
const int interrupt_lvl = (1 << CONFIG_ESP_TIMER_INTERRUPT_LEVEL) & ESP_INTR_FLAG_LEVELMASK;
esp_err_t err = esp_intr_alloc(ETS_TIMER2_INTR_SOURCE, esp_err_t err = esp_intr_alloc(ETS_TIMER2_INTR_SOURCE,
ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM, ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM | interrupt_lvl,
&timer_alarm_isr, NULL, &s_timer_interrupt_handle); &timer_alarm_isr, NULL, &s_timer_interrupt_handle);
if (err != ESP_OK) { if (err != ESP_OK) {

View File

@@ -222,8 +222,9 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
REG_WRITE(LOAD_REG, 1); REG_WRITE(LOAD_REG, 1);
REG_SET_BIT(INT_CLR_REG, TIMG_LACT_INT_CLR); REG_SET_BIT(INT_CLR_REG, TIMG_LACT_INT_CLR);
const int interrupt_lvl = (1 << CONFIG_ESP_TIMER_INTERRUPT_LEVEL) & ESP_INTR_FLAG_LEVELMASK;
esp_err_t err = esp_intr_alloc(INTR_SOURCE_LACT, esp_err_t err = esp_intr_alloc(INTR_SOURCE_LACT,
ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM, ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM | interrupt_lvl,
&timer_alarm_isr, NULL, &s_timer_interrupt_handle); &timer_alarm_isr, NULL, &s_timer_interrupt_handle);
if (err != ESP_OK) { if (err != ESP_OK) {

View File

@@ -103,13 +103,14 @@ void esp_timer_impl_advance(int64_t time_us)
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler) esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
{ {
s_alarm_handler = alarm_handler; s_alarm_handler = alarm_handler;
const int interrupt_lvl = (1 << CONFIG_ESP_TIMER_INTERRUPT_LEVEL) & ESP_INTR_FLAG_LEVELMASK;
#if SOC_SYSTIMER_INT_LEVEL #if SOC_SYSTIMER_INT_LEVEL
int int_type = 0; int int_type = 0;
#else #else
int int_type = ESP_INTR_FLAG_EDGE; int int_type = ESP_INTR_FLAG_EDGE;
#endif // SOC_SYSTIMER_INT_LEVEL #endif // SOC_SYSTIMER_INT_LEVEL
esp_err_t err = esp_intr_alloc(ETS_SYSTIMER_TARGET2_EDGE_INTR_SOURCE, esp_err_t err = esp_intr_alloc(ETS_SYSTIMER_TARGET2_EDGE_INTR_SOURCE,
ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM | int_type, ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM | int_type | interrupt_lvl,
&timer_alarm_isr, NULL, &s_timer_interrupt_handle); &timer_alarm_isr, NULL, &s_timer_interrupt_handle);
if (err != ESP_OK) { if (err != ESP_OK) {