c82adcae1b
Fake S32C1I operation for muxes in PSRAM See merge request idf/esp-idf!1688
111 lines
4.5 KiB
C
111 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));
|
|
}
|
|
|