/********************************************************************************************************************** * COPYRIGHT * ------------------------------------------------------------------------------------------------------------------- * \verbatim * Copyright (c) 2025 by Vector Informatik GmbH. All rights reserved. * * This software is copyright protected and proprietary to Vector Informatik GmbH. * Vector Informatik GmbH grants to you only those rights as set out in the license conditions. * All other rights remain with Vector Informatik GmbH. * \endverbatim * ------------------------------------------------------------------------------------------------------------------- * FILE DESCRIPTION * -----------------------------------------------------------------------------------------------------------------*/ /** \file File: BrsMainStartup.c * Project: Vector Basic Runtime System * Module: BrsMain * * \brief Description: Vector Basic Runtime System module source for startup routines. * * \attention Please note: * The demo and example programs only show special aspects of the software. With regard to the fact * that these programs are meant for demonstration purposes only, Vector Informatik liability shall be * expressly excluded in cases of ordinary negligence, to the extent admissible by law or statute. *********************************************************************************************************************/ /********************************************************************************************************************** * REVISION HISTORY * ------------------------------------------------------------------------------------------------------------------- * Refer to BrsMain.h. *********************************************************************************************************************/ /********************************************************************************************************************** * EXAMPLE CODE ONLY * ------------------------------------------------------------------------------------------------------------------- * This Example Code is only intended for illustrating an example of a possible BSW integration and BSW configuration. * The Example Code has not passed any quality control measures and may be incomplete. The Example Code is neither * intended nor qualified for use in series production. The Example Code as well as any of its modifications and/or * implementations must be tested with diligent care and must comply with all quality requirements which are necessary * according to the state of the art before their use. *********************************************************************************************************************/ #define _BRSMAINSTARTUP_C_ /********************************************************************************************************************** * INCLUDES *********************************************************************************************************************/ #include "BrsMain.h" #include "vLinkGen_Lcfg.h" /********************************************************************************************************************** * VERSION CHECK *********************************************************************************************************************/ #if (BRSMAIN_MAJOR_VERSION != 2u) || (BRSMAIN_MINOR_VERSION != 27u) #error "Header and source file are inconsistent!" #endif #if (BRSMAIN_PATCH_VERSION != 0u) #error "Different versions of patch in Header and Source used!" #endif /********************************************************************************************************************** * CONFIGURATION CHECK *********************************************************************************************************************/ #if (!defined (BRS_INIT_PATTERN_BLOCKS)) || \ (!defined (BRS_INIT_PATTERN_HARDRESET_BLOCKS)) || \ (!defined (BRS_INIT_PATTERN_AREAS)) || \ (!defined (BRS_INIT_PATTERN_HARDRESET_AREAS)) #error "Your environment is missing the mandatory init pattern. They should be generated out of vBRS in Configurator5." #endif #if (VLINKGEN_CFG_MAJOR_VERSION != 2u) #error "This StartUpCode is dependent to the vLinkGen version! vLinkGen major version does not fit!" #else # if (VLINKGEN_CFG_MINOR_VERSION < 16u) #error "This StartUpCode is dependent to the vLinkGen version! Your vLinkGen minor version is too old!" # endif #endif #if defined (BRS_ENABLE_OS_MULTICORESUPPORT) #error "This file was filtered for SingleCore UseCase, but MultiCore UseCase is configured!" #endif /* * Starting with Brs_Template 01.03.13, BrsHw_UnlockCores() is only present if respective macro "BRSHW_CORES_AUTOSTART" * is defined. Older versions have BrsHw_UnlockCores() as unconditional callout. */ /* BRSHW_SOURCECODE_TEMPLATE_VERSION_COMBINED was introduced in Brs_Template 1.04.00 - no check needed */ #if !defined (BRSHW_SOURCECODE_TEMPLATE_VERSION_COMBINED) # if (BRSHW_SOURCECODE_TEMPLATE_VERSION < 0x0103) || ((BRSHW_SOURCECODE_TEMPLATE_VERSION == 0x0103) && \ (BRSHW_SOURCECODE_TEMPLATE_BUGFIX_VERSION < 0x13)) #define BRSHW_CORES_AUTOSTART # endif #endif /********************************************************************************************************************** * DEFINITION + MACROS *********************************************************************************************************************/ #if defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) typedef uint64 BrsAddressType; #else typedef uint32 BrsAddressType; #endif #if defined (BRS_ENABLE_64BIT_INIT_PATTERN) typedef uint64 BrsInitType; #else typedef uint32 BrsInitType; #endif /********************************************************************************************************************** * GLOBAL VARIABLES *********************************************************************************************************************/ #define BRS_START_SEC_SHARED_VAR #include "Brs_MemMap.h" volatile brsMain_ResetReasonType brsMain_ResetReason; #define BRS_STOP_SEC_SHARED_VAR #include "Brs_MemMap.h" /********************************************************************************************************************** * GLOBAL CONST VARIABLES *********************************************************************************************************************/ /********************************************************************************************************************** * LOCAL VARIABLES *********************************************************************************************************************/ /********************************************************************************************************************** * LOCAL CONST VARIABLES *********************************************************************************************************************/ /********************************************************************************************************************** * PROTOTYPES OF GLOBAL FUNCTIONS *********************************************************************************************************************/ /********************************************************************************************************************** * PROTOTYPES OF LOCAL FUNCTIONS *********************************************************************************************************************/ BRSMAIN_MEMINIT_FUNC_PREFIX void Brs_MemoryZeroInit(const vLinkGen_MemAreaSet *memAreaSet, BrsInitType InitPattern, uint32 coreId); #if !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) BRSMAIN_MEMINIT_FUNC_PREFIX void Brs_MemoryInit(const vLinkGen_RamMemAreaSet *memAreaSet, uint32 coreId); #endif #if !defined (BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE) BRSMAIN_MEMINIT_FUNC_PREFIX void BrsHw_AsmMemoryZeroInitLoop_64bit(volatile uint64 *memPtr64, BrsAddressType memAreaEnd, BrsInitType InitPattern); #endif #if defined (BRSMAINSTARTUP_64BIT_MEMORYINIT) || defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) BRSMAIN_MEMINIT_FUNC_PREFIX void BrsHw_AsmMemoryInitLoop_64bit(uint64 *memPtr64, uint64 *romPtr64, BrsAddressType memAreaEnd); #endif /********************************************************************************************************************** * FUNCTION DEFINITIONS *********************************************************************************************************************/ #if defined (BRS_FIRST_EXECUTION_INSTANCE) /* This code is only needed for the first instance in the system */ #define BRS_START_SEC_STARTUP_CODE #include "Brs_MemMap.h" /*****************************************************************************/ /* @brief Unified routine for Pre Main() Startup. * @pre Stack pointer needs to be initilialized in StartUpCode before. * @param[in] - * @param[out] - * @return - * @context Function is called from assembler startup code. * Called by all cores from the booting execution instance. * Through Brs_MemMap.h, the API is mapped into section * brsMainStartup, which allows a fix memory allocation. *****************************************************************************/ void Brs_PreMainStartup(void) { #if defined (BRSHW_EARLYINIT_AVAILABLE) BrsHwEarlyInitPowerOn(); #endif #if (BRS_CPU_CORE_AMOUNT>1) if (BrsHw_GetCore() == BRSHW_INIT_CORE_ID) #endif { brsMain_ResetReason = BrsHwGetResetReasonStartup(); } Brs_ApplicationEntry(); BrsMainExceptionStartup(); /* Illegal return from main */ } #define BRS_STOP_SEC_STARTUP_CODE #include "Brs_MemMap.h" #endif /* BRS_FIRST_EXECUTION_INSTANCE */ #define BRS_START_SEC_BRSAPPLENTRY_CODE #include "Brs_MemMap.h" /*****************************************************************************/ /* @brief Unified application entry for Pre Main() Startup. * @pre Stack pointer needs to be initilialized in StartUpCode before, * brsMain_ResetReason needs to be initialized by booting execution * instance (see Brs_PreMainStartup()). * @param[in] - * @param[out] - * @return - * @context Function is called from Brs_PreMainStartup() of the booting * execution instance or is the direct application entry of * non-booting execution instances (e.g. FBL, with a previously * running BootManager). Through Brs_MemMap.h, the API is mapped * into section brsApplicationEntry, which allows a fix memory * allocation. All APIs are called with current Core ID. *****************************************************************************/ void Brs_ApplicationEntry(void) { uint32 coreID; #if defined (BRSHW_APPLICATIONINIT_AVAILABLE) BrsHwApplicationInit(); #endif coreID = BrsHw_GetCore(); BrsMain_MemoryInit_StageZero_Hook(coreID); #if (VLINKGEN_CFG_NUM_ZERO_INIT_ZERO_GROUPS > 1uL) /* * vLinkGen_ZeroInit_Zero_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "ZERO_INIT" and * Init Stage "ZERO" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_Zero_GroupsSet, BRS_INIT_PATTERN_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_ZERO_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_Zero_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "INIT" and * Init Stage "ZERO" */ Brs_MemoryInit(&vLinkGen_Init_Zero_GroupsSet, coreID); #endif BrsMain_MemoryInit_StageHardReset_Hook(coreID); if (brsMain_ResetReason != BRSMAIN_RESET_SW) { #if (VLINKGEN_CFG_NUM_ZERO_INIT_HARD_RESET_BLOCKS > 1uL) /* * vLinkGen_ZeroInit_HardReset_BlocksSet contains vLinkGen memory region blocks, configured with * Init Stage "HARD_RESET_ONLY" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_HardReset_BlocksSet, BRS_INIT_PATTERN_HARDRESET_BLOCKS, coreID); #endif #if (VLINKGEN_CFG_NUM_ZERO_INIT_HARD_RESET_GROUPS > 1uL) /* * vLinkGen_ZeroInit_HardReset_GroupsSet contains vLinkGen VarSectionGroups, configured with * Init Policy "ZERO_INIT" and Init Stage "HARD_RESET_ONLY" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_HardReset_GroupsSet, BRS_INIT_PATTERN_HARDRESET_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_HARD_RESET_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_HardReset_GroupsSet contains vLinkGen VarSectionGroups, configured with * Init Policy "INIT" and Init Stage "HARD_RESET_ONLY" */ Brs_MemoryInit(&vLinkGen_Init_HardReset_GroupsSet, coreID); #endif } BrsMain_MemoryInit_StageOne_Hook(coreID); #if (VLINKGEN_CFG_NUM_ZERO_INIT_ONE_BLOCKS > 1uL) /* vLinkGen_ZeroInit_One_BlocksSet contains vLinkGen memory region blocks, configured with Init Stage "ONE" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_One_BlocksSet, BRS_INIT_PATTERN_BLOCKS, coreID); #endif #if (VLINKGEN_CFG_NUM_ZERO_INIT_ONE_GROUPS > 1uL) /* * vLinkGen_ZeroInit_One_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "ZERO_INIT" and * Init Stage "ONE" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_One_GroupsSet, BRS_INIT_PATTERN_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_ONE_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_One_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "INIT" and * Init Stage "ONE" */ Brs_MemoryInit(&vLinkGen_Init_One_GroupsSet, coreID); #endif BrsMain_MemoryInit_StageTwo_Hook(coreID); #if (VLINKGEN_CFG_NUM_ZERO_INIT_TWO_GROUPS > 1uL) /* * vLinkGen_ZeroInit_Two_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "ZERO_INIT" and * Init Stage "TWO" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_Two_GroupsSet, BRS_INIT_PATTERN_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_TWO_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_Two_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "INIT" and * Init Stage "TWO" */ Brs_MemoryInit(&vLinkGen_Init_Two_GroupsSet, coreID); #endif BrsMain_MemoryInit_StageThree_Hook(coreID); #if (VLINKGEN_CFG_NUM_ZERO_INIT_THREE_GROUPS > 1uL) /* * vLinkGen_ZeroInit_Three_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "ZERO_INIT" and * Init Stage "THREE" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_Three_GroupsSet, BRS_INIT_PATTERN_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_THREE_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_Three_GroupsSet contains vLinkGen VarSectionGroups, configured with Init Policy "INIT" and * Init Stage "THREE" */ Brs_MemoryInit(&vLinkGen_Init_Three_GroupsSet, coreID); #endif BrsMain_MemoryInit_StagePowerOn_Hook(coreID); /* * --------------------------------------------------------------------------------------------------------------------- * As there is no general condition available for POWER_ON initialization configured memory, these areas are always * initialized as default. A project specific condition could be added here! * * Explanation from AR21-11 SWS_MemoryMapping: * POWER_ON_CLEARED, used for variables that are not explicitly initialized (cleared) during normal start-up. * Instead, these are cleared only after either a power on reset of the microcontroller or a power on reset of * a battery backup memory itself after battery loss. * --------------------------------------------------------------------------------------------------------------------- */ #if (VLINKGEN_CFG_NUM_ZERO_INIT_POWER_ON_GROUPS > 1uL) /* * vLinkGen_ZeroInit_PowerOn_GroupsSet contains vLinkGen VarSectionGroups, configured with * Init Policy "ZERO_INIT" and Init Stage "POWER_ON" */ Brs_MemoryZeroInit(&vLinkGen_ZeroInit_PowerOn_GroupsSet, BRS_INIT_PATTERN_AREAS, coreID); #endif #if (VLINKGEN_CFG_NUM_INIT_POWER_ON_GROUPS > 1uL) && !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /* * vLinkGen_Init_PowerOn_GroupsSet contains vLinkGen VarSectionGroups, configured with * Init Policy "INIT" and Init Stage "POWER_ON" */ Brs_MemoryInit(&vLinkGen_Init_PowerOn_GroupsSet, coreID); #endif BrsMain_PreMainHook(coreID); main(); BrsMainExceptionHandler(kBrsIllegalReturnFromMain, BRSERROR_MODULE_BRSMAIN, (uint16)(__LINE__)); } #define BRS_STOP_SEC_BRSAPPLENTRY_CODE #include "Brs_MemMap.h" #if !defined (BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE) /* * This helper API is necessary, to get native 64-bit access on the HW (e.g. by getting "ldrd" and "strd" * (or even "ldmia" and "stmia") assembly command on Arm Cortex-M platforms) reliable. * That functionality is essential for memory areas with 8-byte aligned ECC! */ BRSMAIN_MEMINIT_FUNC_PREFIX void BrsHw_AsmMemoryZeroInitLoop_64bit(volatile uint64 *memPtr64, BrsAddressType memAreaEnd, BrsInitType InitPattern) { volatile uint64 InitPattern_64bit; volatile const uint64 *memAreaEndPtr = (volatile uint64 *)(memAreaEnd); InitPattern_64bit = InitPattern; # if !defined (BRS_ENABLE_64BIT_INIT_PATTERN) InitPattern_64bit = (InitPattern_64bit << 32) | InitPattern; # endif while (memPtr64 < memAreaEndPtr) { *memPtr64 = InitPattern_64bit; memPtr64++; } } #endif /* !BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE */ /*****************************************************************************/ /* @brief Generic routine for RAM zeroing. * @pre - * @param[in] memAreaSet shall point to the first element of a vLinkGen_MemAreaSet struct array * @param[in] InitPattern describes the pattern, to be used for the memory initialization * @param[in] coreId shall describe the ID of the current CPU * @param[out] - * @return - * @context Function is called from Brs_PreMainStartup() to initialize memory ares, * generated out of vLinkGen configuration *****************************************************************************/ BRSMAIN_MEMINIT_FUNC_PREFIX void Brs_MemoryZeroInit(const vLinkGen_MemAreaSet *memAreaSet, BrsInitType InitPattern, uint32 coreId) { uint32 i; #if !defined (BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE) # if !defined (BRS_ENABLE_64BIT_INIT_PATTERN) volatile BrsAddressType *memPtr; # endif volatile uint64 *memPtr64; volatile uint32 alignment; #endif for (i=0; iNum; i++) { if ((memAreaSet->Areas[i].Core == coreId) && ((memAreaSet->Areas[i].End - memAreaSet->Areas[i].Start) > 0u)) { #if defined (BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE) BrsHw_AsmMemoryZeroInitLoop(memAreaSet->Areas[i].Start, memAreaSet->Areas[i].End, InitPattern); #else alignment = (uint32)memAreaSet->Areas[i].Alignment; if ((alignment != 0u) && (alignment != 4u) && (alignment != 8u)) { /* Handling for the configured alignment is not supported yet */ BrsMainExceptionHandler(kBrsMissingFunctionality, BRSERROR_MODULE_BRSMAINSTARTUP, (uint16)(__LINE__)); } # if !defined (BRS_ENABLE_64BIT_INIT_PATTERN) if ((alignment == 0u) || (alignment == 4u)) { /* 32-bit/4Byte default alignment */ memPtr = (BrsAddressType*)memAreaSet->Areas[i].Start; while ((BrsAddressType)memPtr < memAreaSet->Areas[i].End) { *memPtr = InitPattern; memPtr++; } } if (alignment == 8u) # endif /* !BRS_ENABLE_64BIT_INIT_PATTERN */ { /* 64-bit/8Byte alignment or 64-Bit Init Pattern enabled */ memPtr64 = (uint64*)memAreaSet->Areas[i].Start; BrsHw_AsmMemoryZeroInitLoop_64bit((volatile uint64*)memPtr64, memAreaSet->Areas[i].End, InitPattern); } #endif /* else BRSHW_ASM_MEMORY_ZERO_INIT_LOOP_AVAILABLE */ } } } /* * To prevent issues with not 8-Byte aligned memory areas, the 64-bit memory initialization is disabled per default. * If you want to use it, take care about the alignment and enable BRSMAINSTARTUP_64BIT_MEMORYINIT. * Or enable the 64-bit addressing in vLinkGen. * For ECC-RAM with 8-Byte aligned ECC, the memory should be handled by ZeroInit in advance */ #if defined (BRSMAINSTARTUP_64BIT_MEMORYINIT) || defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) /* * This helper API is necessary, to get native 64-bit access on the HW (e.g. by getting "ldrd" and "strd" * (or even "ldmia" and "stmia") assembly commands on Arm Cortex-M platforms) reliable. * That functionality is essential for memory areas with 8-byte aligned ECC! */ BRSMAIN_MEMINIT_FUNC_PREFIX void BrsHw_AsmMemoryInitLoop_64bit(uint64 *memPtr64, uint64 *romPtr64, BrsAddressType memAreaEnd) { while ((uint64)romPtr64 < memAreaEnd) { *memPtr64 = *romPtr64; memPtr64++; romPtr64++; } } #endif /* BRSMAINSTARTUP_64BIT_MEMORYINIT || VLINKGEN_CFG_64BIT_MODE_ENABLED */ #if !defined (BRS_DISABLE_MEMORY_INIT_GLOBALLY) /*****************************************************************************/ /* @brief Generic routine for ROM to RAM initialization. * @pre - * @param[in] memAreasSet shall point to the first element of a vLinkGen_RamMemAreaSet struct array * @param[in] coreId shall describe the ID of the current CPU * @param[out] - * @return - * @context Function is called from Brs_PreMainStartup() to initialize memory ares, * generated out of vLinkGen configuration *****************************************************************************/ BRSMAIN_MEMINIT_FUNC_PREFIX void Brs_MemoryInit(const vLinkGen_RamMemAreaSet *memAreasSet, uint32 coreId) { #if !defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) volatile uint32 *memPtr32; volatile const uint32 *romPtr32; #endif uint32 i; volatile uint32 alignment; #if defined (BRSMAINSTARTUP_64BIT_MEMORYINIT) || defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) volatile uint64 *memPtr64; volatile const uint64 *romPtr64; #endif for (i = 0; i < memAreasSet->Num; i++) { if ((memAreasSet->Areas[i].Core == coreId) && ((memAreasSet->Areas[i].Romend - memAreasSet->Areas[i].Romstart) > 0u)) { if ((memAreasSet->Areas[i].End - memAreasSet->Areas[i].Start) < (memAreasSet->Areas[i].Romend - memAreasSet->Areas[i].Romstart)) { /* Defined size in RAM is smaller than the ROM size -> data will not fit */ BrsMainExceptionHandler(kBrsIllegalParameter, BRSERROR_MODULE_BRSMAINSTARTUP, (uint16)(__LINE__)); } alignment = (uint32)memAreasSet->Areas[i].Alignment; if ((alignment != 0u) && (alignment != 4u) && (alignment != 8u)) { /* Handling for the configured alignment is not supported yet */ BrsMainExceptionHandler(kBrsMissingFunctionality, BRSERROR_MODULE_BRSMAINSTARTUP, (uint16)(__LINE__)); } #if defined (VLINKGEN_CFG_64BIT_MODE_ENABLED) /* 64-Bit Init Pattern enabled */ memPtr64 = (uint64*)memAreasSet->Areas[i].Start; romPtr64 = (uint64*)memAreasSet->Areas[i].Romstart; BrsHw_AsmMemoryInitLoop_64bit((uint64*)memPtr64, (uint64*)romPtr64, memAreasSet->Areas[i].Romend); #else # if defined (BRSMAINSTARTUP_64BIT_MEMORYINIT) if ((alignment == 0u) || (alignment == 4u)) { /* 32-bit/4Byte default alignment */ # endif memPtr32 = (uint32*)memAreasSet->Areas[i].Start; romPtr32 = (uint32*)memAreasSet->Areas[i].Romstart; while ((BrsAddressType)romPtr32 < memAreasSet->Areas[i].Romend) { *memPtr32 = *romPtr32; memPtr32++; romPtr32++; } # if defined (BRSMAINSTARTUP_64BIT_MEMORYINIT) } if (alignment == 8u) { /* 64-bit/8Byte alignment */ memPtr64 = (uint64*)memAreasSet->Areas[i].Start; romPtr64 = (uint64*)memAreasSet->Areas[i].Romstart; BrsHw_AsmMemoryInitLoop_64bit((uint64*)memPtr64, (uint64*)romPtr64, memAreasSet->Areas[i].Romend); } # endif /* BRSMAINSTARTUP_64BIT_MEMORYINIT */ #endif /* VLINKGEN_CFG_64BIT_MODE_ENABLED */ } } } #endif /* !BRS_DISABLE_MEMORY_INIT_GLOBALLY */ #if !defined (VVIRTUALTARGET) # if defined (BRS_FIRST_EXECUTION_INSTANCE) /* This code is only needed for the first instance in the system */ #define BRS_START_SEC_STARTUP_CODE #include "Brs_MemMap.h" /*****************************************************************************/ /* @brief This is the central exeption/issue handler of BRS, in startup * phase. * @pre - * @param[in] - * @param[out] - * @return - * @context This function implements an endless loop. The recommendation is * to set a breakpoint on top of this function to see if any check * has failed during the startup code execution. *****************************************************************************/ void BrsMainExceptionStartup(void) { volatile uint8 BrsMainStartup_Continue; BrsMainStartup_Continue = 0; while (BrsMainStartup_Continue == 0u) { /* * Set BrsMainStartup_Continue to 1 to continue here. * If the debugger is not able to show the stack properly, this mechanism can be used to find the * source of the exception. */ } } #define BRS_STOP_SEC_STARTUP_CODE #include "Brs_MemMap.h" # endif /* BRS_FIRST_EXECUTION_INSTANCE */ #endif /* VVIRTUALTARGET */