1 /***************************************************************************//** 2 * @file 3 * @brief RAM code support. 4 ******************************************************************************* 5 * # License 6 * <b>Copyright 2018 Silicon Laboratories Inc. www.silabs.com</b> 7 ******************************************************************************* 8 * 9 * SPDX-License-Identifier: Zlib 10 * 11 * The licensor of this software is Silicon Laboratories Inc. 12 * 13 * This software is provided 'as-is', without any express or implied 14 * warranty. In no event will the authors be held liable for any damages 15 * arising from the use of this software. 16 * 17 * Permission is granted to anyone to use this software for any purpose, 18 * including commercial applications, and to alter it and redistribute it 19 * freely, subject to the following restrictions: 20 * 21 * 1. The origin of this software must not be misrepresented; you must not 22 * claim that you wrote the original software. If you use this software 23 * in a product, an acknowledgment in the product documentation would be 24 * appreciated but is not required. 25 * 2. Altered source versions must be plainly marked as such, and must not be 26 * misrepresented as being the original software. 27 * 3. This notice may not be removed or altered from any source distribution. 28 * 29 ******************************************************************************/ 30 31 #ifndef EM_RAMFUNC_H 32 #define EM_RAMFUNC_H 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 /* *INDENT-OFF* */ 39 /***************************************************************************//** 40 * @addtogroup ramfunc RAMFUNC - RAM Function Support 41 * @brief RAM code support 42 * @details 43 * Provides support for executing code from RAM. 44 * Provides a unified method to manage RAM code across all supported tools. 45 * @{ 46 47 @note 48 Other cross-compiler support macros are implemented in [COMMON](../../common/api/group-common). 49 50 @note 51 Functions executing from RAM should not be declared as static. 52 53 @warning 54 Standard library facilities are available to the tool with GCC in hosted 55 mode (default), regardless of the section attribute. Calls to standard 56 libraries placed in the default section may therefore occur. To disable 57 hosted mode, add '-ffreestanding' to the build command line. This is the 58 only way to guarantee no calls to standard libraries with GCC. 59 Read more at www.gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Standards.html 60 61 @warning 62 Keil/ARM uVision users must add a section named "ram_code" in their linker 63 scatter file. This section must be in RAM memory. Look in the MCU SDK for 64 example scatter files (ram_code.sct). 65 66 @n @section ramfunc_usage Usage 67 68 In your .h file: 69 @verbatim 70 #include "em_ramfunc.h" 71 72 SL_RAMFUNC_DECLARATOR 73 void MyPrint(const char* string); 74 @endverbatim 75 76 Issues have been observed with ARM GCC when there is no declarator. It is 77 recommended to have a declarator also for internal functions but move the 78 declarator to the .c file. 79 80 In your .c file: 81 @verbatim 82 #include "em_ramfunc.h" 83 84 SL_RAMFUNC_DEFINITION_BEGIN 85 void MyPrint(const char* string) 86 { 87 ... 88 } 89 SL_RAMFUNC_DEFINITION_END 90 @endverbatim 91 92 ******************************************************************************/ 93 /* *INDENT-ON* */ 94 95 /******************************************************************************* 96 ****************************** DEFINES *********************************** 97 ******************************************************************************/ 98 99 /** 100 * @brief 101 * This define is not present by default. By compiling with define 102 * @ref SL_RAMFUNC_DISABLE, code placed in RAM by SL_RAMFUNC macros 103 * will be placed in default code space (Flash) instead. 104 * 105 * @note 106 * This define is not present by default. 107 */ 108 #if defined(DOXY_DOC_ONLY) 109 #define SL_RAMFUNC_DISABLE 110 #endif 111 112 #if defined(SL_RAMFUNC_DISABLE) 113 /** @brief Compiler ported function declarator for RAM code. */ 114 #define SL_RAMFUNC_DECLARATOR 115 116 /** @brief Compiler ported function definition begin marker for RAM code. */ 117 #define SL_RAMFUNC_DEFINITION_BEGIN 118 119 /** @brief Compiler ported function definition end marker for RAM code. */ 120 #define SL_RAMFUNC_DEFINITION_END 121 122 #elif defined(__CC_ARM) 123 /* MDK-ARM compiler */ 124 #define SL_RAMFUNC_DECLARATOR 125 #define SL_RAMFUNC_DEFINITION_BEGIN _Pragma("arm section code=\"ram_code\"") 126 #define SL_RAMFUNC_DEFINITION_END _Pragma("arm section code") 127 128 #elif defined(__ICCARM__) 129 /* IAR Embedded Workbench */ 130 #define SL_RAMFUNC_DECLARATOR __ramfunc 131 #define SL_RAMFUNC_DEFINITION_BEGIN SL_RAMFUNC_DECLARATOR 132 #define SL_RAMFUNC_DEFINITION_END 133 134 #elif defined(__GNUC__) && (defined(__CROSSWORKS_ARM) || defined(__SES_ARM)) 135 /* Rowley Crossworks and Segger Embedded Studio */ 136 #define SL_RAMFUNC_DECLARATOR __attribute__ ((section(".fast"))) 137 #define SL_RAMFUNC_DEFINITION_BEGIN SL_RAMFUNC_DECLARATOR 138 #define SL_RAMFUNC_DEFINITION_END 139 140 #elif defined(__GNUC__) && defined(CONFIG_SOC_FAMILY_EXX32) 141 /* Zephyr environment */ 142 #define SL_RAMFUNC_DECLARATOR __attribute__ ((section(".ramfunc"))) 143 #define SL_RAMFUNC_DEFINITION_BEGIN SL_RAMFUNC_DECLARATOR 144 #define SL_RAMFUNC_DEFINITION_END 145 146 #elif defined(__GNUC__) 147 /* Simplicity Studio, Atollic and Vanilla armgcc */ 148 #define SL_RAMFUNC_DECLARATOR __attribute__ ((section(".ram"))) 149 #define SL_RAMFUNC_DEFINITION_BEGIN SL_RAMFUNC_DECLARATOR 150 #define SL_RAMFUNC_DEFINITION_END 151 152 #endif 153 154 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ 155 /* Deprecated macro names */ 156 #define RAMFUNC_DECLARATOR SL_RAMFUNC_DECLARATOR 157 #define RAMFUNC_DEFINITION_BEGIN SL_RAMFUNC_DEFINITION_BEGIN 158 #define RAMFUNC_DEFINITION_END SL_RAMFUNC_DEFINITION_END 159 /** @endcond */ 160 161 /** @} (end addtogroup ramfunc) */ 162 163 #ifdef __cplusplus 164 } 165 #endif 166 167 #endif /* EM_RAMFUNC_H */ 168