mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-02 12:14:32 +02:00
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:
@@ -413,7 +413,7 @@ static esp_err_t UART_ISR_ATTR uart_pattern_enqueue(uart_port_t uart_num, int po
|
|||||||
{
|
{
|
||||||
UART_CHECK((p_uart_obj[uart_num]), "uart driver error", ESP_FAIL);
|
UART_CHECK((p_uart_obj[uart_num]), "uart driver error", ESP_FAIL);
|
||||||
esp_err_t ret = ESP_OK;
|
esp_err_t ret = ESP_OK;
|
||||||
UART_ENTER_CRITICAL(&uart_spinlock[uart_num]);
|
UART_ENTER_CRITICAL_ISR(&uart_spinlock[uart_num]);
|
||||||
uart_pat_rb_t *p_pos = &p_uart_obj[uart_num]->rx_pattern_pos;
|
uart_pat_rb_t *p_pos = &p_uart_obj[uart_num]->rx_pattern_pos;
|
||||||
int next = p_pos->wr + 1;
|
int next = p_pos->wr + 1;
|
||||||
if (next >= p_pos->len) {
|
if (next >= p_pos->len) {
|
||||||
@@ -427,7 +427,7 @@ static esp_err_t UART_ISR_ATTR uart_pattern_enqueue(uart_port_t uart_num, int po
|
|||||||
p_pos->wr = next;
|
p_pos->wr = next;
|
||||||
ret = ESP_OK;
|
ret = ESP_OK;
|
||||||
}
|
}
|
||||||
UART_EXIT_CRITICAL(&uart_spinlock[uart_num]);
|
UART_EXIT_CRITICAL_ISR(&uart_spinlock[uart_num]);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
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.
|
// 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,
|
// 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,
|
// 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);
|
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)));
|
} 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)
|
static void IRAM_ATTR timer_alarm_isr(void *arg)
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include "freertos/semphr.h"
|
#include "freertos/semphr.h"
|
||||||
#include "test_utils.h"
|
#include "test_utils.h"
|
||||||
#include "esp_private/esp_timer_impl.h"
|
#include "esp_private/esp_timer_impl.h"
|
||||||
|
#include "esp_freertos_hooks.h"
|
||||||
|
|
||||||
#ifdef CONFIG_ESP_TIMER_PROFILING
|
#ifdef CONFIG_ESP_TIMER_PROFILING
|
||||||
#define WITH_PROFILING 1
|
#define WITH_PROFILING 1
|
||||||
@@ -650,6 +651,43 @@ TEST_CASE("after esp_timer_impl_advance, timers run when expected", "[esp_timer]
|
|||||||
ref_clock_deinit();
|
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)
|
#if !defined(CONFIG_FREERTOS_UNICORE) && defined(CONFIG_ESP32_DPORT_WORKAROUND)
|
||||||
|
|
||||||
#include "soc/dport_reg.h"
|
#include "soc/dport_reg.h"
|
||||||
|
@@ -222,7 +222,7 @@ uint64_t IRAM_ATTR esp_timer_impl_get_time(void)
|
|||||||
|
|
||||||
void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
|
void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
|
||||||
{
|
{
|
||||||
portENTER_CRITICAL(&s_time_update_lock);
|
portENTER_CRITICAL_SAFE(&s_time_update_lock);
|
||||||
// Alarm time relative to the moment when counter was 0
|
// Alarm time relative to the moment when counter was 0
|
||||||
uint64_t time_after_timebase_us = timestamp - s_time_base_us;
|
uint64_t time_after_timebase_us = timestamp - s_time_base_us;
|
||||||
// Adjust current time if overflow has happened
|
// Adjust current time if overflow has happened
|
||||||
@@ -252,7 +252,7 @@ void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp)
|
|||||||
alarm_reg_val = (uint32_t) compare_val;
|
alarm_reg_val = (uint32_t) compare_val;
|
||||||
}
|
}
|
||||||
REG_WRITE(FRC_TIMER_ALARM_REG(1), alarm_reg_val);
|
REG_WRITE(FRC_TIMER_ALARM_REG(1), alarm_reg_val);
|
||||||
portEXIT_CRITICAL(&s_time_update_lock);
|
portEXIT_CRITICAL_SAFE(&s_time_update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void IRAM_ATTR timer_alarm_isr(void *arg)
|
static void IRAM_ATTR timer_alarm_isr(void *arg)
|
||||||
|
@@ -264,12 +264,12 @@ static IRAM_ATTR bool timer_armed(esp_timer_handle_t timer)
|
|||||||
|
|
||||||
static IRAM_ATTR void timer_list_lock(void)
|
static IRAM_ATTR void timer_list_lock(void)
|
||||||
{
|
{
|
||||||
portENTER_CRITICAL(&s_timer_lock);
|
portENTER_CRITICAL_SAFE(&s_timer_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static IRAM_ATTR void timer_list_unlock(void)
|
static IRAM_ATTR void timer_list_unlock(void)
|
||||||
{
|
{
|
||||||
portEXIT_CRITICAL(&s_timer_lock);
|
portEXIT_CRITICAL_SAFE(&s_timer_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void timer_process_alarm(esp_timer_dispatch_t dispatch_method)
|
static void timer_process_alarm(esp_timer_dispatch_t dispatch_method)
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
idf_component_register(SRCS "src/nvs_api.cpp"
|
set(srcs "src/nvs_api.cpp"
|
||||||
"src/nvs_encr.cpp"
|
|
||||||
"src/nvs_item_hash_list.cpp"
|
"src/nvs_item_hash_list.cpp"
|
||||||
"src/nvs_ops.cpp"
|
"src/nvs_ops.cpp"
|
||||||
"src/nvs_page.cpp"
|
"src/nvs_page.cpp"
|
||||||
"src/nvs_pagemanager.cpp"
|
"src/nvs_pagemanager.cpp"
|
||||||
"src/nvs_storage.cpp"
|
"src/nvs_storage.cpp"
|
||||||
"src/nvs_types.cpp"
|
"src/nvs_types.cpp")
|
||||||
|
if(CONFIG_NVS_ENCRYPTION)
|
||||||
|
list(APPEND srcs "src/nvs_encr.cpp")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
idf_component_register(SRCS "${srcs}"
|
||||||
REQUIRES spi_flash mbedtls
|
REQUIRES spi_flash mbedtls
|
||||||
INCLUDE_DIRS include)
|
INCLUDE_DIRS include)
|
||||||
|
@@ -5,3 +5,7 @@
|
|||||||
COMPONENT_ADD_INCLUDEDIRS := include
|
COMPONENT_ADD_INCLUDEDIRS := include
|
||||||
|
|
||||||
COMPONENT_SRCDIRS := src
|
COMPONENT_SRCDIRS := src
|
||||||
|
|
||||||
|
ifndef CONFIG_NVS_ENCRYPTION
|
||||||
|
COMPONENT_OBJEXCLUDE := src/nvs_encr.o
|
||||||
|
endif
|
||||||
|
Reference in New Issue
Block a user