mirror of
https://github.com/espressif/esp-idf.git
synced 2025-09-30 19:19:21 +00:00
fix(freertos): Incorrect assert in FreeRTOS port layer when not in ISR context
This commit fixes an issue where in the FreeRTOS port layer would cause the portASSERT_IF_IN_ISR() assert check to fail even when the system is not in an interrupt context.
This commit is contained in:
@@ -96,6 +96,13 @@ typedef spinlock_t portMUX_TYPE; /**< Spi
|
||||
|
||||
BaseType_t xPortCheckIfInISR(void);
|
||||
|
||||
/**
|
||||
* @brief Assert if in ISR context
|
||||
*
|
||||
* - Asserts on xPortCheckIfInISR() internally
|
||||
*/
|
||||
void vPortAssertIfInISR(void);
|
||||
|
||||
// ------------------ Critical Sections --------------------
|
||||
|
||||
/*
|
||||
@@ -169,6 +176,15 @@ void vPortTCBPreDeleteHook( void *pxTCB );
|
||||
#define portENABLE_INTERRUPTS() vPortClearInterruptMask(1)
|
||||
#define portRESTORE_INTERRUPTS(x) vPortClearInterruptMask(x)
|
||||
|
||||
/**
|
||||
* @brief Assert if in ISR context
|
||||
*
|
||||
* TODO: Enable once ISR safe version of vTaskEnter/ExitCritical() is implemented
|
||||
* for single-core SMP FreeRTOS Kernel. (IDF-10540)
|
||||
*/
|
||||
// #define portASSERT_IF_IN_ISR() vPortAssertIfInISR()
|
||||
|
||||
|
||||
// ------------------ Critical Sections --------------------
|
||||
|
||||
#define portGET_TASK_LOCK() vPortTakeLock(&port_xTaskLock)
|
||||
|
@@ -168,6 +168,12 @@ BaseType_t xPortCheckIfInISR(void)
|
||||
return uxInterruptNesting;
|
||||
}
|
||||
|
||||
void vPortAssertIfInISR(void)
|
||||
{
|
||||
/* Assert if the interrupt nesting count is > 0 */
|
||||
configASSERT(xPortCheckIfInISR() == 0);
|
||||
}
|
||||
|
||||
// ------------------ Critical Sections --------------------
|
||||
|
||||
void IRAM_ATTR vPortTakeLock( portMUX_TYPE *lock )
|
||||
@@ -384,7 +390,7 @@ FORCE_INLINE_ATTR UBaseType_t uxInitialiseStackTLS(UBaseType_t uxStackPointer, u
|
||||
#if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER
|
||||
static void vPortTaskWrapper(TaskFunction_t pxCode, void *pvParameters)
|
||||
{
|
||||
__asm__ volatile(".cfi_undefined ra"); // tell to debugger that it's outermost (inital) frame
|
||||
__asm__ volatile(".cfi_undefined ra"); // tell to debugger that it's outermost (initial) frame
|
||||
extern void __attribute__((noreturn)) panic_abort(const char *details);
|
||||
static char DRAM_ATTR msg[80] = "FreeRTOS: FreeRTOS Task \"\0";
|
||||
pxCode(pvParameters);
|
||||
@@ -451,7 +457,7 @@ StackType_t *pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxC
|
||||
HIGH ADDRESS
|
||||
|---------------------------| <- pxTopOfStack on entry
|
||||
| TLS Variables |
|
||||
| ------------------------- | <- Start of useable stack
|
||||
| ------------------------- | <- Start of usable stack
|
||||
| Starting stack frame |
|
||||
| ------------------------- | <- pxTopOfStack on return (which is the tasks current SP)
|
||||
| | |
|
||||
|
Reference in New Issue
Block a user