mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 11:09:01 +01:00 
			
		
		
		
	* Use new version of CI-CD Actions * Use cSpell spell check, and use ubuntu-20.04 for formatting check * Format and spell check all files in the portable directory * Remove the https:// from #errors and #warnings as uncrustify attempts to change it to /* * Use checkout@v3 instead of checkout@v2 on all jobs ---------
		
			
				
	
	
		
			101 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 */
 | 
						|
 | 
						|
/* This header exists for performance reasons, in order to inline the
 | 
						|
 * implementation of vPortCPUAcquireMutexIntsDisabled and
 | 
						|
 * vPortCPUReleaseMutexIntsDisabled into the
 | 
						|
 * vTaskEnterCritical/vTaskExitCritical functions in task.c as well as the
 | 
						|
 * vPortCPUAcquireMutex/vPortCPUReleaseMutex implementations.
 | 
						|
 *
 | 
						|
 * Normally this kind of performance hack is over the top, but
 | 
						|
 * vTaskEnterCritical/vTaskExitCritical is called a great
 | 
						|
 * deal by FreeRTOS internals.
 | 
						|
 *
 | 
						|
 * It should be #included by freertos port.c or tasks.c, in esp-idf.
 | 
						|
 *
 | 
						|
 * The way it works is that it essentially uses portmux_impl.inc.h as a
 | 
						|
 * generator template of sorts. When no external memory is used, this
 | 
						|
 * template is only used to generate the vPortCPUAcquireMutexIntsDisabledInternal
 | 
						|
 * and vPortCPUReleaseMutexIntsDisabledInternal functions, which use S32C1 to
 | 
						|
 * do an atomic compare & swap. When external memory is used the functions
 | 
						|
 * vPortCPUAcquireMutexIntsDisabledExtram and vPortCPUReleaseMutexIntsDisabledExtram
 | 
						|
 * are also generated, which use uxPortCompareSetExtram to fake the S32C1 instruction.
 | 
						|
 * The wrapper functions vPortCPUAcquireMutexIntsDisabled and
 | 
						|
 * vPortCPUReleaseMutexIntsDisabled will then use the appropriate function to do the
 | 
						|
 * actual lock/unlock.
 | 
						|
 */
 | 
						|
#include "soc/cpu.h"
 | 
						|
#include "portable.h"
 | 
						|
 | 
						|
/* XOR one core ID with this value to get the other core ID */
 | 
						|
#if ( ESP_IDF_VERSION < ESP_IDF_VERSION_VAL( 4, 2, 0 ) )
 | 
						|
    #define CORE_ID_XOR_SWAP           ( CORE_ID_PRO ^ CORE_ID_APP )
 | 
						|
#else
 | 
						|
    #define CORE_ID_REGVAL_XOR_SWAP    ( CORE_ID_REGVAL_PRO ^ CORE_ID_REGVAL_APP )
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*Define the mux routines for use with muxes in internal RAM */
 | 
						|
#define PORTMUX_AQUIRE_MUX_FN_NAME     vPortCPUAcquireMutexIntsDisabledInternal
 | 
						|
#define PORTMUX_RELEASE_MUX_FN_NAME    vPortCPUReleaseMutexIntsDisabledInternal
 | 
						|
#define PORTMUX_COMPARE_SET_FN_NAME    uxPortCompareSet
 | 
						|
#include "portmux_impl.inc.h"
 | 
						|
#undef PORTMUX_AQUIRE_MUX_FN_NAME
 | 
						|
#undef PORTMUX_RELEASE_MUX_FN_NAME
 | 
						|
#undef PORTMUX_COMPARE_SET_FN_NAME
 | 
						|
 | 
						|
 | 
						|
#if defined( CONFIG_SPIRAM_SUPPORT )
 | 
						|
 | 
						|
    #define PORTMUX_AQUIRE_MUX_FN_NAME     vPortCPUAcquireMutexIntsDisabledExtram
 | 
						|
    #define PORTMUX_RELEASE_MUX_FN_NAME    vPortCPUReleaseMutexIntsDisabledExtram
 | 
						|
    #define PORTMUX_COMPARE_SET_FN_NAME    uxPortCompareSetExtram
 | 
						|
    #include "portmux_impl.inc.h"
 | 
						|
    #undef PORTMUX_AQUIRE_MUX_FN_NAME
 | 
						|
    #undef PORTMUX_RELEASE_MUX_FN_NAME
 | 
						|
    #undef PORTMUX_COMPARE_SET_FN_NAME
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
 | 
						|
    #define PORTMUX_AQUIRE_MUX_FN_ARGS     portMUX_TYPE * mux, int timeout_cycles, const char * fnName, int line
 | 
						|
    #define PORTMUX_RELEASE_MUX_FN_ARGS    portMUX_TYPE * mux, const char * fnName, int line
 | 
						|
    #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x )     x, timeout_cycles, fnName, line
 | 
						|
    #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x )    x, fnName, line
 | 
						|
#else
 | 
						|
    #define PORTMUX_AQUIRE_MUX_FN_ARGS     portMUX_TYPE * mux, int timeout_cycles
 | 
						|
    #define PORTMUX_RELEASE_MUX_FN_ARGS    portMUX_TYPE * mux
 | 
						|
    #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x )     x, timeout_cycles
 | 
						|
    #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x )    x
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
static inline bool __attribute__( ( always_inline ) ) vPortCPUAcquireMutexIntsDisabled( PORTMUX_AQUIRE_MUX_FN_ARGS )
 | 
						|
{
 | 
						|
    #if defined( CONFIG_SPIRAM_SUPPORT )
 | 
						|
        if( esp_ptr_external_ram( mux ) )
 | 
						|
        {
 | 
						|
            return vPortCPUAcquireMutexIntsDisabledExtram( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) );
 | 
						|
        }
 | 
						|
    #endif
 | 
						|
    return vPortCPUAcquireMutexIntsDisabledInternal( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static inline void vPortCPUReleaseMutexIntsDisabled( PORTMUX_RELEASE_MUX_FN_ARGS )
 | 
						|
{
 | 
						|
    #if defined( CONFIG_SPIRAM_SUPPORT )
 | 
						|
        if( esp_ptr_external_ram( mux ) )
 | 
						|
        {
 | 
						|
            vPortCPUReleaseMutexIntsDisabledExtram( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) );
 | 
						|
            return;
 | 
						|
        }
 | 
						|
    #endif
 | 
						|
    vPortCPUReleaseMutexIntsDisabledInternal( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) );
 | 
						|
}
 |