Merge branch 'bugfix/freertos_critical_section_compliance' into 'master'

Changes in uart and esp_timer for critical section compliance with vanilla FreeRTOS

See merge request espressif/esp-idf!6733
This commit is contained in:
Mahavir Jain
2019-11-21 19:25:14 +08:00
7 changed files with 62 additions and 16 deletions
+2 -2
View File
@@ -211,7 +211,7 @@ uint64_t IRAM_ATTR esp_timer_impl_get_time(void)
void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
{
portENTER_CRITICAL(&s_time_update_lock);
portENTER_CRITICAL_SAFE(&s_time_update_lock);
// Use calculated alarm value if it is less than ALARM_OVERFLOW_VAL.
// Note that if by the time we update ALARM_REG, COUNT_REG value is higher,
// interrupt will not happen for another ALARM_OVERFLOW_VAL timer ticks,
@@ -237,7 +237,7 @@ void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
}
REG_WRITE(FRC_TIMER_ALARM_REG(1), alarm_reg_val);
} while (REG_READ(FRC_TIMER_ALARM_REG(1)) <= REG_READ(FRC_TIMER_COUNT_REG(1)));
portEXIT_CRITICAL(&s_time_update_lock);
portEXIT_CRITICAL_SAFE(&s_time_update_lock);
}
static void IRAM_ATTR timer_alarm_isr(void *arg)
+38
View File
@@ -11,6 +11,7 @@
#include "freertos/semphr.h"
#include "test_utils.h"
#include "esp_private/esp_timer_impl.h"
#include "esp_freertos_hooks.h"
#ifdef CONFIG_ESP_TIMER_PROFILING
#define WITH_PROFILING 1
@@ -650,6 +651,43 @@ TEST_CASE("after esp_timer_impl_advance, timers run when expected", "[esp_timer]
ref_clock_deinit();
}
static esp_timer_handle_t timer1;
static SemaphoreHandle_t sem;
static void IRAM_ATTR test_tick_hook(void)
{
static int i;
const int iterations = 16;
if (++i <= iterations) {
if (i & 0x1) {
TEST_ESP_OK(esp_timer_start_once(timer1, 5000));
} else {
TEST_ESP_OK(esp_timer_stop(timer1));
}
} else {
xSemaphoreGiveFromISR(sem, 0);
}
}
TEST_CASE("Can start/stop timer from ISR context", "[esp_timer]")
{
void timer_func(void* arg)
{
printf("timer cb\n");
}
esp_timer_create_args_t create_args = {
.callback = &timer_func,
};
TEST_ESP_OK(esp_timer_create(&create_args, &timer1));
sem = xSemaphoreCreateBinary();
esp_register_freertos_tick_hook(test_tick_hook);
TEST_ASSERT(xSemaphoreTake(sem, portMAX_DELAY));
esp_deregister_freertos_tick_hook(test_tick_hook);
TEST_ESP_OK( esp_timer_delete(timer1) );
vSemaphoreDelete(sem);
}
#if !defined(CONFIG_FREERTOS_UNICORE) && defined(CONFIG_ESP32_DPORT_WORKAROUND)
#include "soc/dport_reg.h"