text: // DOM-IGNORE-BEGIN
  /*******************************************************************************
  * Copyright (C) 2018 Microchip Technology Inc. and its subsidiaries.
  *
  * Subject to your compliance with these terms, you may use Microchip software
  * and any derivatives exclusively with Microchip products. It is your
  * responsibility to comply with third party license terms applicable to your
  * use of third party software (including open source software) that may
  * accompany Microchip software.
  *
  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
  * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
  * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
  * PARTICULAR PURPOSE.
  *
  * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
  * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
  * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
  * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
  * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
  * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
  *******************************************************************************/
  // DOM-IGNORE-END
  
  #include "definitions.h" /* for potential custom handler names */
  #include <libpic32c.h>
  #include <sys/cdefs.h>
  #include <stdbool.h>
  
  /*
   *  The MPLAB X Simulator does not yet support simulation of programming the
   *  GPNVM bits yet. We can remove this once it supports the FRDY bit.
   */
  #ifdef __MPLAB_DEBUGGER_SIMULATOR
  #define __XC32_SKIP_STARTUP_GPNVM_WAIT
  #endif
  
  /*
   *  This startup code relies on features that are specific to the MPLAB XC32
   *  toolchain. Do not use it with other toolchains.
   */
  #ifndef __XC32
  #warning This startup code is intended for use with the MPLAB XC32 Compiler only.
  #endif
  
  /* Initialize segments */
  extern uint32_t __svectors;
  
  int main(void);
  extern void __attribute__((long_call)) __libc_init_array(void);
  
  /* Device Vector information is available in interrupt.c file */
  
  __STATIC_INLINE void FPU_Enable(void);
  
  #if (__ARM_FP==14) || (__ARM_FP==4)
  
  /* Enable FPU */
  __STATIC_INLINE void FPU_Enable(void)
  {
      uint32_t prim;
      prim = __get_PRIMASK();
      __disable_irq();
  
       SCB->CPACR |= (0xFu << 20);
      __DSB();
      __ISB();
  
      if (!prim)
      {
          __enable_irq();
      }
  }
  #endif /* (__ARM_FP==14) || (__ARM_FP==4) */
  __STATIC_INLINE void TCM_Disable(void);
  __STATIC_INLINE void TCM_Enable(void);
  __STATIC_INLINE void TCM_Configure(uint32_t tcmSize);
  __STATIC_INLINE void ICache_Enable(void);
  __STATIC_INLINE void DCache_Enable(void);
  
  /** Program CMCC CSIZESW bits for TCM and cache configuration */
  __STATIC_INLINE void TCM_Configure(uint32_t tcmSize)
  {
      CMCC_REGS->CMCC_CFG = CMCC_CFG_CSIZESW(tcmSize);
  }
  
  /** Enable TCM memory */
  __STATIC_INLINE void  __attribute__((optimize("-O1"))) TCM_Enable(void)
  {
      /* TCM cannot be enabled or disabled in SAME5x/SAMD5x family*/
  }
  
  /* Disable TCM memory */
  __STATIC_INLINE void  __attribute__((optimize("-O1"))) TCM_Disable(void)
  {
      /* TCM cannot be enabled or disabled in SAME5x/SAMD5x family*/
  }
  
  __STATIC_INLINE void ICache_Enable(void)
  {
      CMCC_REGS->CMCC_CTRL &= ~(CMCC_CTRL_CEN_Msk);
      while((CMCC_REGS->CMCC_SR & CMCC_SR_CSTS_Msk) == CMCC_SR_CSTS_Msk)
      {
          /*Wait for the operation to complete*/
      }
      CMCC_REGS->CMCC_CFG |= (CMCC_CFG_DCDIS_Msk);
      CMCC_REGS->CMCC_CTRL = (CMCC_CTRL_CEN_Msk);
  }
  
  __STATIC_INLINE void DCache_Enable(void)
  {
  }
  /* Optional application-provided functions */
  extern void __attribute__((weak,long_call)) _on_reset(void);
  extern void __attribute__((weak,long_call)) _on_bootstrap(void);
  
  /* Reserved for use by the MPLAB XC32 Compiler */
  extern void __attribute__((weak,long_call)) __xc32_on_reset(void);
  extern void __attribute__((weak,long_call)) __xc32_on_bootstrap(void);
  
  
  /**
   * \brief This is the code that gets called on processor reset.
   * To initialize the device, and call the main() routine.
   */
  void __attribute__((optimize("-O1"), section(".text.Reset_Handler"), long_call, noreturn)) Reset_Handler(void)
  {
  #ifdef SCB_VTOR_TBLOFF_Msk
      uint32_t *pSrc;
  #endif
  
  #if defined (__REINIT_STACK_POINTER)
      /* Initialize SP from linker-defined _stack symbol. */
      __asm__ volatile ("ldr sp, =_stack" : : : "sp");
  
  #ifdef SCB_VTOR_TBLOFF_Msk
      /* Buy stack for locals */
      __asm__ volatile ("sub sp, sp, #8" : : : "sp");
  #endif
      __asm__ volatile ("add r7, sp, #0" : : : "r7");
  #endif
  
  
      /* Call the optional application-provided _on_reset() function. */
      if (_on_reset)
      {
          _on_reset();
      }
  
      /* Reserved for use by MPLAB XC32. */
      if (__xc32_on_reset)
          __xc32_on_reset();
  
  #if (__ARM_FP==14) || (__ARM_FP==4)
      /* Enable the FPU if the application is built with -mfloat-abi=softfp or -mfloat-abi=hard */
      FPU_Enable();
  #endif
  
  
      TCM_Configure(2);
  
      /* Enable TCM   */
      TCM_Enable();
  
      /* Initialize data after TCM is enabled.
       * Data initialization from the XC32 .dinit template */
      __pic32c_data_initialization();
  
  
  #  ifdef SCB_VTOR_TBLOFF_Msk
      /*  Set the vector-table base address in FLASH */
      pSrc = (uint32_t *) & __svectors;
      SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);
  #  endif /* SCB_VTOR_TBLOFF_Msk */
  
      /* Initialize the C library */
      __libc_init_array();
  
  
      /* Enable Instruction Cache */
      ICache_Enable();
  
  
      /* Call the optional application-provided _on_bootstrap() function. */
      if (_on_bootstrap)
      {
          _on_bootstrap();
      }
  
      /* Reserved for use by MPLAB XC32. */
      if (__xc32_on_bootstrap)
      {
          __xc32_on_bootstrap();
      }
  
      /* Branch to application's main function */
      main();
  
  #if (defined(__DEBUG) || defined(__DEBUG_D)) && defined(__XC32)
      __builtin_software_breakpoint();
  #endif
      /* Infinite loop */
      while (1) {}
  }
  