mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 12:35:28 +00:00
esp_timer: use freertos critical section compliant APIs
Some modules use esp_timer from interrupt context and hence with vanilla FreeRTOS it should use correct critical section API
This commit is contained in:
@@ -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"
|
||||
|
Reference in New Issue
Block a user