/* ###################################################################
**     This component module is generated by Processor Expert. Do not modify it.
**     Filename    : McuCriticalSection.h
**     Project     : FRDM-K64F_Generator
**     Processor   : MK64FN1M0VLL12
**     Component   : CriticalSection
**     Version     : Component 01.015, Driver 01.00, CPU db: 3.00.000
**     Compiler    : GNU C Compiler
**     Date/Time   : 2021-11-25, 06:25, # CodeGen: 749
**     Abstract    :
**
**     Settings    :
**          Component name                                 : McuCriticalSection
**          SDK                                            : McuLib
**          Use Processor Expert Default                   : no
**          Use FreeRTOS                                   : no
**     Contents    :
**         CriticalVariable - void McuCriticalSection_CriticalVariable(void);
**         EnterCritical    - void McuCriticalSection_EnterCritical(void);
**         ExitCritical     - void McuCriticalSection_ExitCritical(void);
**         Deinit           - void McuCriticalSection_Deinit(void);
**         Init             - void McuCriticalSection_Init(void);
**
** * Copyright (c) 2014-2021, Erich Styger
**  * Web:         https://mcuoneclipse.com
**  * SourceForge: https://sourceforge.net/projects/mcuoneclipse
**  * Git:         https://github.com/ErichStyger/McuOnEclipse_PEx
**  * All rights reserved.
**  *
**  * Redistribution and use in source and binary forms, with or without modification,
**  * are permitted provided that the following conditions are met:
**  *
**  * - Redistributions of source code must retain the above copyright notice, this list
**  *   of conditions and the following disclaimer.
**  *
**  * - Redistributions in binary form must reproduce the above copyright notice, this
**  *   list of conditions and the following disclaimer in the documentation and/or
**  *   other materials provided with the distribution.
**  *
**  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
**  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
**  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
**  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
**  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
**  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
**  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
**  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
**  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
**  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
** ###################################################################*/
/*!
** @file McuCriticalSection.h
** @version 01.00
** @brief
**
*/         
/*!
**  @addtogroup McuCriticalSection_module McuCriticalSection module documentation
**  @{
*/         

#ifndef __McuCriticalSection_H
#define __McuCriticalSection_H

/* MODULE McuCriticalSection. */
#include "McuLib.h" /* SDK and API used */
#include "McuCriticalSectionconfig.h" /* configuration */


/* other includes needed */
#if McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION
  #if McuLib_CONFIG_CPU_IS_ESP32
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"  /* FreeRTOS header file for taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros */
  #else
    #include "FreeRTOS.h"
    #include "task.h"  /* FreeRTOS header file for taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros */
  #endif
#endif

#ifdef __cplusplus
extern "C" {
#endif


/* workaround macros for wrong EnterCritical()/ExitCritical() in the low level drivers. */
#define McuCriticalSection_CriticalVariableDrv() \
  McuCriticalSection_CriticalVariable()
#define McuCriticalSection_EnterCriticalDrv() \
  McuCriticalSection_EnterCritical()
#define McuCriticalSection_ExitCriticalDrv() \
  McuCriticalSection_ExitCritical()

#ifdef __HIWARE__
  #pragma MESSAGE DISABLE C3303 /* C3303 Implicit concatenation of strings */
#endif

#if McuCriticalSection_CONFIG_USE_PEX_DEFAULT
  #define McuCriticalSection_CriticalVariable() /* nothing needed */
#elif McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION
  #define McuCriticalSection_CriticalVariable() /* nothing needed */
#elif McuCriticalSection_CONFIG_USE_CUSTOM_CRITICAL_SECTION
  #if McuLib_CONFIG_CPU_IS_RISC_V
    #define McuCriticalSection_CriticalVariable() /* nothing needed */
  #else
    #define McuCriticalSection_CriticalVariable() uint8_t cpuSR; /* variable to store current status */
  #endif
#endif
/*
** ===================================================================
**     Method      :  CriticalVariable (component CriticalSection)
**
**     Description :
**         Defines a variable if necessary. This is a macro.
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

#if McuCriticalSection_CONFIG_USE_PEX_DEFAULT
  #define McuCriticalSection_EnterCritical()   EnterCritical()
#elif McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION
  #define McuCriticalSection_EnterCritical()   taskENTER_CRITICAL_FROM_ISR() /* FreeRTOS critical section inside interrupt */
#elif McuCriticalSection_CONFIG_USE_CUSTOM_CRITICAL_SECTION
  #if McuLib_CONFIG_CPU_IS_RISC_V
    #define McuCriticalSection_EnterCritical() \
      do {                                  \
      __asm volatile( "csrc mstatus, 8" ); /* Disable interrupts */ \
      } while(0)
  #elif McuLib_CONFIG_CPU_IS_ARM_CORTEX_M
    #define McuCriticalSection_EnterCritical() \
      do {                                  \
      /*lint -save  -esym(529,cpuSR) Symbol 'cpuSR' not subsequently referenced. */\
      __asm (                             \
      "mrs   r0, PRIMASK     \n\t"        \
      "cpsid i               \n\t"        \
      "strb r0, %[output]   \n\t"         \
      : [output] "=m" (cpuSR) :: "r0");   \
      __asm ("" ::: "memory");            \
      /*lint -restore Symbol 'cpuSR' not subsequently referenced. */\
      } while(0)
    #endif
#endif
/*
** ===================================================================
**     Method      :  EnterCritical (component CriticalSection)
**
**     Description :
**         Enters a critical section
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

#if McuCriticalSection_CONFIG_USE_PEX_DEFAULT
  #define McuCriticalSection_ExitCritical()   ExitCritical()
#elif McuCriticalSection_CONFIG_USE_RTOS_CRITICAL_SECTION
  #define McuCriticalSection_ExitCritical()   taskEXIT_CRITICAL_FROM_ISR(0) /* FreeRTOS critical section inside interrupt */
#elif McuCriticalSection_CONFIG_USE_CUSTOM_CRITICAL_SECTION

  #if McuLib_CONFIG_CPU_IS_RISC_V
    #define McuCriticalSection_ExitCritical() \
      do {                                  \
        __asm volatile( "csrs mstatus, 8" ); /* Enable interrupts */ \
      } while(0)
  #elif McuLib_CONFIG_CPU_IS_ARM_CORTEX_M
    #define McuCriticalSection_ExitCritical() \
     do{                                  \
     __asm (                            \
     "ldrb r0, %[input]    \n\t"        \
     "msr PRIMASK,r0        \n\t"       \
     ::[input] "m" (cpuSR) : "r0");     \
     } while(0)
  #endif
#endif
/*
** ===================================================================
**     Method      :  ExitCritical (component CriticalSection)
**
**     Description :
**         Exits a critical section
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

void McuCriticalSection_Deinit(void);
/*
** ===================================================================
**     Method      :  Deinit (component CriticalSection)
**
**     Description :
**         Driver de-initialization routine
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

void McuCriticalSection_Init(void);
/*
** ===================================================================
**     Method      :  Init (component CriticalSection)
**
**     Description :
**         driver initialization routine
**     Parameters  : None
**     Returns     : Nothing
** ===================================================================
*/

/* END McuCriticalSection. */

#ifdef __cplusplus
}
#endif

#endif
/* ifndef __McuCriticalSection_H */
/*!
** @}
*/
