mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 00:51:42 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
    Copyright (C) 2016-2017 Espressif Shanghai PTE LTD
 | 
						|
    Copyright (C) 2015 Real Time Engineers Ltd.
 | 
						|
 | 
						|
    All rights reserved
 | 
						|
 | 
						|
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
						|
    the terms of the GNU General Public License (version 2) as published by the
 | 
						|
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
 | 
						|
 | 
						|
	***************************************************************************
 | 
						|
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
						|
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
						|
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
						|
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
						|
	***************************************************************************
 | 
						|
 | 
						|
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
						|
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
 | 
						|
    link: http://www.freertos.org/a00114.html
 | 
						|
*/
 | 
						|
 | 
						|
/* 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 */
 | 
						|
#define CORE_ID_XOR_SWAP (CORE_ID_PRO ^ CORE_ID_APP)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//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));
 | 
						|
}
 | 
						|
 |