mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
9b3796d2f1
Add TRY_ENTRY_CRITICAL() API to all for timeouts when entering critical sections. The following port API were added: - portTRY_ENTER_CRITICAL() - portTRY_ENTER_CRITICAL_ISR() - portTRY_ENTER_CRITICAL_SAFE() Deprecated legacy spinlock API in favor of spinlock.h. The following API were deprecated: - vPortCPUInitializeMutex() - vPortCPUAcquireMutex() - vPortCPUAcquireMutexTimeout() - vPortCPUReleaseMutex() Other Changes: - Added portMUX_INITIALIZE() to replace vPortCPUInitializeMutex() - The assembly of the critical section functions ends up being about 50 instructions longer, thus the spinlock test pass threshold had to be increased to account for the extra runtime. Closes https://github.com/espressif/esp-idf/issues/5301
186 lines
6.4 KiB
C
186 lines
6.4 KiB
C
/*
|
|
* FreeRTOS Kernel V10.4.3
|
|
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
* the Software without restriction, including without limitation the rights to
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
* subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* http://www.FreeRTOS.org
|
|
* http://aws.amazon.com/freertos
|
|
*
|
|
* 1 tab == 4 spaces!
|
|
*/
|
|
#ifndef PORTMACRO_H
|
|
#define PORTMACRO_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <limits.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
/*-----------------------------------------------------------
|
|
* Port specific definitions.
|
|
*
|
|
* The settings in this file configure FreeRTOS correctly for the
|
|
* given hardware and compiler.
|
|
*
|
|
* These settings should not be altered.
|
|
*-----------------------------------------------------------
|
|
*/
|
|
|
|
/* Type definitions. */
|
|
#define portCHAR uint8_t
|
|
#define portFLOAT float
|
|
#define portDOUBLE double
|
|
#define portLONG int32_t
|
|
#define portSHORT int16_t
|
|
#define portSTACK_TYPE uint8_t
|
|
#define portBASE_TYPE int
|
|
// interrupt module will mask interrupt with priority less than threshold
|
|
#define RVHAL_EXCM_LEVEL 4
|
|
|
|
typedef portSTACK_TYPE StackType_t;
|
|
typedef portBASE_TYPE BaseType_t;
|
|
typedef unsigned portBASE_TYPE UBaseType_t;
|
|
|
|
#if (configUSE_16_BIT_TICKS == 1)
|
|
typedef uint16_t TickType_t;
|
|
#define portMAX_DELAY (TickType_t)0xffff
|
|
#else
|
|
typedef uint32_t TickType_t;
|
|
#define portMAX_DELAY (TickType_t)0xffffffffUL
|
|
#endif
|
|
/*------------------------------------------------------*/
|
|
|
|
/* Architecture specifics. */
|
|
#define portSTACK_GROWTH (-1)
|
|
#define portTICK_PERIOD_MS ((TickType_t)(1000 / configTICK_RATE_HZ))
|
|
#define portBYTE_ALIGNMENT 16
|
|
/*-----------------------------------------------------------*/
|
|
|
|
#define portCRITICAL_NESTING_IN_TCB 0
|
|
|
|
/*
|
|
* Send an interrupt to another core in order to make the task running
|
|
* on it yield for a higher-priority task.
|
|
*/
|
|
void vPortYieldOtherCore(BaseType_t coreid);
|
|
|
|
/*
|
|
Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack
|
|
watchpoint around.
|
|
*/
|
|
void vPortSetStackWatchpoint(void *pxStackStart);
|
|
|
|
/*
|
|
* Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs
|
|
* aren't detected here, but they normally cannot call C code, so that should not be an issue anyway.
|
|
*/
|
|
BaseType_t xPortInIsrContext(void);
|
|
|
|
/*
|
|
* This function will be called in High prio ISRs. Returns true if the current core was in ISR context
|
|
* before calling into high prio ISR context.
|
|
*/
|
|
BaseType_t xPortInterruptedFromISRContext(void);
|
|
|
|
/* "mux" data structure (spinlock) */
|
|
typedef struct {
|
|
/* owner field values:
|
|
* 0 - Uninitialized (invalid)
|
|
* portMUX_FREE_VAL - Mux is free, can be locked by either CPU
|
|
* CORE_ID_REGVAL_PRO / CORE_ID_REGVAL_APP - Mux is locked to the particular core
|
|
*
|
|
*
|
|
* Any value other than portMUX_FREE_VAL, CORE_ID_REGVAL_PRO, CORE_ID_REGVAL_APP indicates corruption
|
|
*/
|
|
uint32_t owner;
|
|
/* count field:
|
|
* If mux is unlocked, count should be zero.
|
|
* If mux is locked, count is non-zero & represents the number of recursive locks on the mux.
|
|
*/
|
|
uint32_t count;
|
|
} portMUX_TYPE;
|
|
|
|
#define portMUX_FREE_VAL SPINLOCK_FREE
|
|
|
|
/* Special constants for vPortCPUAcquireMutexTimeout() */
|
|
#define portMUX_NO_TIMEOUT SPINLOCK_WAIT_FOREVER /* When passed for 'timeout_cycles', spin forever if necessary */
|
|
#define portMUX_TRY_LOCK SPINLOCK_NO_WAIT /* Try to acquire the spinlock a single time only */
|
|
|
|
// Keep this in sync with the portMUX_TYPE struct definition please.
|
|
#define portMUX_INITIALIZER_UNLOCKED \
|
|
{ .owner = portMUX_FREE_VAL, .count = 0, }
|
|
|
|
/* Scheduler utilities. */
|
|
extern void vPortYield(void);
|
|
extern void vPortYieldFromISR(void);
|
|
|
|
#define portYIELD() vPortYield()
|
|
#define portYIELD_FROM_ISR() vPortYieldFromISR()
|
|
|
|
/* Yielding within an API call (when interrupts are off), means the yield should be delayed
|
|
until interrupts are re-enabled.
|
|
To do this, we use the "cross-core" interrupt as a trigger to yield on this core when interrupts are re-enabled.This
|
|
is the same interrupt & code path which is used to trigger a yield between CPUs, although in this case the yield is
|
|
happening on the same CPU.
|
|
*/
|
|
#define portYIELD_WITHIN_API() portYIELD()
|
|
/*-----------------------------------------------------------*/
|
|
|
|
/* Critical section management. */
|
|
extern int vPortSetInterruptMask(void);
|
|
extern void vPortClearInterruptMask(int);
|
|
|
|
extern void vPortEnterCritical(void);
|
|
extern void vPortExitCritical(void);
|
|
|
|
extern void esp_vApplicationIdleHook(void);
|
|
extern void esp_vApplicationTickHook(void);
|
|
|
|
#ifndef CONFIG_FREERTOS_LEGACY_HOOKS
|
|
#define vApplicationIdleHook esp_vApplicationIdleHook
|
|
#define vApplicationTickHook esp_vApplicationTickHook
|
|
#endif /* !CONFIG_FREERTOS_LEGACY_HOOKS */
|
|
|
|
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
|
#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void* pvParameters)
|
|
#define portTASK_FUNCTION(vFunction, pvParameters) void vFunction(void* pvParameters)
|
|
|
|
void vApplicationSleep(TickType_t xExpectedIdleTime);
|
|
#define portSUPPRESS_TICKS_AND_SLEEP(idleTime) vApplicationSleep(idleTime)
|
|
|
|
#define portNOP() //__asm volatile ( " nop " )
|
|
|
|
#define portVALID_TCB_MEM(ptr) // esp_ptr_byte_accessible(ptr)
|
|
#define portVALID_STACK_MEM(ptr) // esp_ptr_byte_accessible(ptr)
|
|
|
|
#endif //__ASSEMBLER__
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PORTMACRO_H */
|