Merge pull request #11947 from gschorcht/cpu/esp32/freertos-critcial-sections

cpu/esp32: critcial section handling changed in FreeRTOS adaptation layer
This commit is contained in:
benpicco 2019-09-05 12:40:45 +02:00 committed by GitHub
commit dbd97b7588
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 10 deletions

View File

@ -4,7 +4,6 @@ MODULE = cpu
# Add a list of subdirectories, that should also be built:
DIRS += $(RIOTCPU)/esp_common
DIRS += periph
DIRS += freertos
DIRS += vendor
ifneq (, $(filter esp_cxx, $(USEMODULE)))
@ -23,4 +22,8 @@ ifneq (, $(filter esp_wifi, $(USEMODULE)))
DIRS += esp-wifi
endif
ifneq (, $(filter riot_freertos, $(USEMODULE)))
DIRS += freertos
endif
include $(RIOTBASE)/Makefile.base

View File

@ -79,6 +79,7 @@ USEMODULE += periph_hwrng
USEMODULE += periph_flash
USEMODULE += periph_rtc
USEMODULE += periph_uart
USEMODULE += riot_freertos
USEMODULE += random
USEMODULE += stdio_uart
USEMODULE += xtensa

View File

@ -10,7 +10,7 @@
#ifndef DOXYGEN
#define ENABLE_DEBUG 0
#define ENABLE_DEBUG (0)
#include "debug.h"
#include <string.h>
@ -139,8 +139,14 @@ void vTaskEnterCritical( portMUX_TYPE *mux )
/* disable interrupts */
uint32_t state = irq_disable();
/* aquire the mutex with interrupts disabled */
mutex_lock(mux); /* TODO should be only a spin lock */
/* Locking the given mutex does not work here, as this function can also
be called in the interrupt context. Therefore, the given mutex is not
used. Instead, the basic default FreeRTOS mechanism for critical
sections is used by simply disabling interrupts. Since context
switches for the ESP32 are also based on interrupts, there is no
possibility that another thread will enter the critical section
once the interrupts are disabled. */
/* mutex_lock(mux); */ /* TODO should be only a spin lock */
/* increment nesting counter and save old interrupt level */
threads_arch_exts[my_pid].critical_nesting++;
@ -157,8 +163,9 @@ void vTaskExitCritical( portMUX_TYPE *mux )
DEBUG("%s pid=%d prio=%d mux=%p\n", __func__,
my_pid, sched_threads[my_pid]->priority, mux);
/* release the mutex with interrupts disabled */
mutex_unlock(mux); /* TODO should be only a spin lock */
/* The given mutex is not used (see vTaskEnterCritical) and has not to
be unlocked here. */
/* mutex_unlock(mux); */ /* TODO should be only a spin lock */
/* decrement nesting counter and restore old interrupt level */
if (threads_arch_exts[my_pid].critical_nesting) {

View File

@ -30,8 +30,8 @@ extern "C" {
#define portMUX_TYPE mutex_t
#define portMUX_INITIALIZER_UNLOCKED MUTEX_INIT
#define portENTER_CRITICAL(pm) mutex_lock(pm)
#define portEXIT_CRITICAL(pm) mutex_unlock(pm)
#define portENTER_CRITICAL(mux) vTaskEnterCritical(mux)
#define portEXIT_CRITICAL(mux) vTaskExitCritical(mux)
#define portENTER_CRITICAL_NESTED irq_disable
#define portEXIT_CRITICAL_NESTED irq_restore
@ -39,15 +39,18 @@ extern "C" {
#define portEXIT_CRITICAL_ISR(mux) vTaskExitCritical(mux)
#define taskENTER_CRITICAL(mux) portENTER_CRITICAL(mux)
#define taskENTER_CRITICAL_ISR(mux) portENTER_CRITICAL_ISR(mux)
#define taskENTER_CRITICAL_ISR(mux) portENTER_CRITICAL_ISR(mux)
#define taskEXIT_CRITICAL(mux) portEXIT_CRITICAL(mux)
#define taskEXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux)
#define taskEXIT_CRITICAL_ISR(mux) portEXIT_CRITICAL_ISR(mux)
#define portYIELD_FROM_ISR thread_yield_higher
#define portNUM_PROCESSORS 2
#define xPortGetCoreID() PRO_CPU_NUM
extern void vTaskEnterCritical(portMUX_TYPE *mux);
extern void vTaskExitCritical(portMUX_TYPE *mux);
#ifdef __cplusplus
}
#endif