Marco Zecchini / Mbed OS Example_RTOS
Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /***************************************************************************//**
marcozecchini 0:9fca2b23d0ba 2 * @file em_common.h
marcozecchini 0:9fca2b23d0ba 3 * @brief General purpose utilities.
marcozecchini 0:9fca2b23d0ba 4 * @version 5.1.2
marcozecchini 0:9fca2b23d0ba 5 *******************************************************************************
marcozecchini 0:9fca2b23d0ba 6 * @section License
marcozecchini 0:9fca2b23d0ba 7 * <b>Copyright 2016 Silicon Laboratories, Inc. http://www.silabs.com</b>
marcozecchini 0:9fca2b23d0ba 8 *******************************************************************************
marcozecchini 0:9fca2b23d0ba 9 *
marcozecchini 0:9fca2b23d0ba 10 * Permission is granted to anyone to use this software for any purpose,
marcozecchini 0:9fca2b23d0ba 11 * including commercial applications, and to alter it and redistribute it
marcozecchini 0:9fca2b23d0ba 12 * freely, subject to the following restrictions:
marcozecchini 0:9fca2b23d0ba 13 *
marcozecchini 0:9fca2b23d0ba 14 * 1. The origin of this software must not be misrepresented; you must not
marcozecchini 0:9fca2b23d0ba 15 * claim that you wrote the original software.
marcozecchini 0:9fca2b23d0ba 16 * 2. Altered source versions must be plainly marked as such, and must not be
marcozecchini 0:9fca2b23d0ba 17 * misrepresented as being the original software.
marcozecchini 0:9fca2b23d0ba 18 * 3. This notice may not be removed or altered from any source distribution.
marcozecchini 0:9fca2b23d0ba 19 *
marcozecchini 0:9fca2b23d0ba 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
marcozecchini 0:9fca2b23d0ba 21 * obligation to support this Software. Silicon Labs is providing the
marcozecchini 0:9fca2b23d0ba 22 * Software "AS IS", with no express or implied warranties of any kind,
marcozecchini 0:9fca2b23d0ba 23 * including, but not limited to, any implied warranties of merchantability
marcozecchini 0:9fca2b23d0ba 24 * or fitness for any particular purpose or warranties against infringement
marcozecchini 0:9fca2b23d0ba 25 * of any proprietary rights of a third party.
marcozecchini 0:9fca2b23d0ba 26 *
marcozecchini 0:9fca2b23d0ba 27 * Silicon Labs will not be liable for any consequential, incidental, or
marcozecchini 0:9fca2b23d0ba 28 * special damages, or any other relief, or for any claim by any third party,
marcozecchini 0:9fca2b23d0ba 29 * arising from your use of this Software.
marcozecchini 0:9fca2b23d0ba 30 *
marcozecchini 0:9fca2b23d0ba 31 ******************************************************************************/
marcozecchini 0:9fca2b23d0ba 32 #ifndef EM_COMMON_H
marcozecchini 0:9fca2b23d0ba 33 #define EM_COMMON_H
marcozecchini 0:9fca2b23d0ba 34
marcozecchini 0:9fca2b23d0ba 35 #include "em_device.h"
marcozecchini 0:9fca2b23d0ba 36 #include <stdbool.h>
marcozecchini 0:9fca2b23d0ba 37
marcozecchini 0:9fca2b23d0ba 38 #ifdef __cplusplus
marcozecchini 0:9fca2b23d0ba 39 extern "C" {
marcozecchini 0:9fca2b23d0ba 40 #endif
marcozecchini 0:9fca2b23d0ba 41
marcozecchini 0:9fca2b23d0ba 42 /***************************************************************************//**
marcozecchini 0:9fca2b23d0ba 43 * @defgroup emlib EMLIB
marcozecchini 0:9fca2b23d0ba 44 * @brief Low-level peripheral library
marcozecchini 0:9fca2b23d0ba 45 * @details
marcozecchini 0:9fca2b23d0ba 46 * EMLIB is a low-level peripheral support library that provides a unified API for
marcozecchini 0:9fca2b23d0ba 47 * all EFM32, EZR32 and EFR32 MCUs and SoCs from Silicon Laboratories.
marcozecchini 0:9fca2b23d0ba 48 *
marcozecchini 0:9fca2b23d0ba 49 * EMLIB modules are provided for all peripherals and core features. The library
marcozecchini 0:9fca2b23d0ba 50 * implements no interrupt handlers. Static data, critical sections and module
marcozecchini 0:9fca2b23d0ba 51 * interdependencies are kept at a minimum.
marcozecchini 0:9fca2b23d0ba 52 *
marcozecchini 0:9fca2b23d0ba 53 * @note
marcozecchini 0:9fca2b23d0ba 54 * EMLIB functions assert on error if DEBUG_EFM is defined. See @ref ASSERT
marcozecchini 0:9fca2b23d0ba 55 * for more information on error handling and default assertion and how to
marcozecchini 0:9fca2b23d0ba 56 * implement a custom handler.
marcozecchini 0:9fca2b23d0ba 57 *
marcozecchini 0:9fca2b23d0ba 58 * @n
marcozecchini 0:9fca2b23d0ba 59 * @note
marcozecchini 0:9fca2b23d0ba 60 * EMLIB does not implement support for radio features. Please refer to stack
marcozecchini 0:9fca2b23d0ba 61 * documentation for more information on RF support.
marcozecchini 0:9fca2b23d0ba 62 * @{
marcozecchini 0:9fca2b23d0ba 63 ******************************************************************************/
marcozecchini 0:9fca2b23d0ba 64
marcozecchini 0:9fca2b23d0ba 65 /***************************************************************************//**
marcozecchini 0:9fca2b23d0ba 66 * @addtogroup COMMON
marcozecchini 0:9fca2b23d0ba 67 * @brief General purpose utilities and cross-compiler support.
marcozecchini 0:9fca2b23d0ba 68 * @details
marcozecchini 0:9fca2b23d0ba 69 * This SDK supports the following compilers/IDEs:
marcozecchini 0:9fca2b23d0ba 70 * @li Simplicity Studio
marcozecchini 0:9fca2b23d0ba 71 * @li IAR Embedded Workbench
marcozecchini 0:9fca2b23d0ba 72 * @li Atollic TrueSTUDIO IDE
marcozecchini 0:9fca2b23d0ba 73 * @li Rowley Associates CrossWorks for ARM
marcozecchini 0:9fca2b23d0ba 74 * @li Keil µVision IDE
marcozecchini 0:9fca2b23d0ba 75 * @li Plain armgcc
marcozecchini 0:9fca2b23d0ba 76 *
marcozecchini 0:9fca2b23d0ba 77 * Certain compiler features such as alignment is implemented differently in the tools.
marcozecchini 0:9fca2b23d0ba 78 * Therefore, macros such as @ref SL_ALIGN are provided to enable compiler independent
marcozecchini 0:9fca2b23d0ba 79 * code.
marcozecchini 0:9fca2b23d0ba 80 *
marcozecchini 0:9fca2b23d0ba 81 * @note RAM code macros are implemented in a separate module @ref RAMFUNC.
marcozecchini 0:9fca2b23d0ba 82 * Cross-compiler RAM code support needs extended documentation and it is therefore
marcozecchini 0:9fca2b23d0ba 83 * implemented as a separate module.
marcozecchini 0:9fca2b23d0ba 84 *
marcozecchini 0:9fca2b23d0ba 85 * @{
marcozecchini 0:9fca2b23d0ba 86 ******************************************************************************/
marcozecchini 0:9fca2b23d0ba 87
marcozecchini 0:9fca2b23d0ba 88 #if !defined(__GNUC__)
marcozecchini 0:9fca2b23d0ba 89 /* Not GCC compilers */
marcozecchini 0:9fca2b23d0ba 90
marcozecchini 0:9fca2b23d0ba 91 /** @brief Macro for getting minimum value. */
marcozecchini 0:9fca2b23d0ba 92 #define SL_MIN(a, b) ((a) < (b) ? (a) : (b))
marcozecchini 0:9fca2b23d0ba 93
marcozecchini 0:9fca2b23d0ba 94 /** @brief Macro for getting maximum value. */
marcozecchini 0:9fca2b23d0ba 95 #define SL_MAX(a, b) ((a) > (b) ? (a) : (b))
marcozecchini 0:9fca2b23d0ba 96
marcozecchini 0:9fca2b23d0ba 97 /** @brief Macros for handling packed structs. */
marcozecchini 0:9fca2b23d0ba 98 #define STRINGIZE(X) #X
marcozecchini 0:9fca2b23d0ba 99 #define SL_PACK_START(X) _Pragma(STRINGIZE(pack(X)))
marcozecchini 0:9fca2b23d0ba 100 #define SL_PACK_END() _Pragma("pack()")
marcozecchini 0:9fca2b23d0ba 101 #define SL_ATTRIBUTE_PACKED
marcozecchini 0:9fca2b23d0ba 102
marcozecchini 0:9fca2b23d0ba 103 #if defined(__CC_ARM)
marcozecchini 0:9fca2b23d0ba 104 /** @brief MDK-ARM compiler: Macros for handling aligned structs. */
marcozecchini 0:9fca2b23d0ba 105 #define SL_ALIGN(X) __align(X)
marcozecchini 0:9fca2b23d0ba 106
marcozecchini 0:9fca2b23d0ba 107 /** MDK-ARM compiler: Macro for handling weak symbols. */
marcozecchini 0:9fca2b23d0ba 108 #define SL_WEAK __attribute__ ((weak))
marcozecchini 0:9fca2b23d0ba 109
marcozecchini 0:9fca2b23d0ba 110 /** MDK-ARM compiler: Macro for handling non-returning functions. */
marcozecchini 0:9fca2b23d0ba 111 #define SL_NORETURN __attribute__ ((noreturn))
marcozecchini 0:9fca2b23d0ba 112
marcozecchini 0:9fca2b23d0ba 113 /** MDK-ARM compiler: Macro for handling section placement */
marcozecchini 0:9fca2b23d0ba 114 #define SL_ATTRIBUTE_SECTION(X) __attribute__ ((section(X)))
marcozecchini 0:9fca2b23d0ba 115 #endif
marcozecchini 0:9fca2b23d0ba 116
marcozecchini 0:9fca2b23d0ba 117 #if defined(__ICCARM__)
marcozecchini 0:9fca2b23d0ba 118 /** @brief IAR Embedded Workbench: Macros for handling aligned structs. */
marcozecchini 0:9fca2b23d0ba 119 #define SL_ALIGN(X) _Pragma(STRINGIZE(data_alignment=X))
marcozecchini 0:9fca2b23d0ba 120
marcozecchini 0:9fca2b23d0ba 121 /** @brief IAR Embedded Workbench: Macros for handling weak symbols. */
marcozecchini 0:9fca2b23d0ba 122 #define SL_WEAK __weak
marcozecchini 0:9fca2b23d0ba 123
marcozecchini 0:9fca2b23d0ba 124 /** @brief IAR Embedded Workbench: Macro for handling non-returning functions. */
marcozecchini 0:9fca2b23d0ba 125 #define SL_NORETURN __noreturn
marcozecchini 0:9fca2b23d0ba 126
marcozecchini 0:9fca2b23d0ba 127 /** IAR Embedded Workbench: Macro for handling section placement */
marcozecchini 0:9fca2b23d0ba 128 #define SL_ATTRIBUTE_SECTION(X) @ X
marcozecchini 0:9fca2b23d0ba 129 #endif
marcozecchini 0:9fca2b23d0ba 130
marcozecchini 0:9fca2b23d0ba 131 #define SL_ATTRIBUTE_ALIGN(X)
marcozecchini 0:9fca2b23d0ba 132
marcozecchini 0:9fca2b23d0ba 133 #else // !defined(__GNUC__)
marcozecchini 0:9fca2b23d0ba 134 /* GCC compilers */
marcozecchini 0:9fca2b23d0ba 135
marcozecchini 0:9fca2b23d0ba 136 /** @brief Macro for getting minimum value. No sideeffects, a and b are evaluated once only. */
marcozecchini 0:9fca2b23d0ba 137 #define SL_MIN(a, b) __extension__({__typeof__(a) _a = (a); __typeof__(b) _b = (b); _a < _b ? _a : _b;})
marcozecchini 0:9fca2b23d0ba 138
marcozecchini 0:9fca2b23d0ba 139 /** @brief Macro for getting maximum value. No sideeffects, a and b are evaluated once only. */
marcozecchini 0:9fca2b23d0ba 140 #define SL_MAX(a, b) __extension__({__typeof__(a) _a = (a); __typeof__(b) _b = (b); _a > _b ? _a : _b;})
marcozecchini 0:9fca2b23d0ba 141
marcozecchini 0:9fca2b23d0ba 142 /** @brief GCC style macro for handling packed structs. */
marcozecchini 0:9fca2b23d0ba 143 #define SL_ATTRIBUTE_PACKED __attribute__ ((packed))
marcozecchini 0:9fca2b23d0ba 144
marcozecchini 0:9fca2b23d0ba 145 /** @brief Macro for handling packed structs.
marcozecchini 0:9fca2b23d0ba 146 * @n Use this macro before the struct definition.
marcozecchini 0:9fca2b23d0ba 147 * @n X denotes the maximum alignment of struct members. X is not supported with
marcozecchini 0:9fca2b23d0ba 148 * GCC. GCC always use 1 byte maximum alignment.
marcozecchini 0:9fca2b23d0ba 149 */
marcozecchini 0:9fca2b23d0ba 150 #define SL_PACK_START(x)
marcozecchini 0:9fca2b23d0ba 151
marcozecchini 0:9fca2b23d0ba 152 /** @brief Macro for handling packed structs.
marcozecchini 0:9fca2b23d0ba 153 * @n Use this macro after the struct definition.
marcozecchini 0:9fca2b23d0ba 154 * @n With GCC, add SL_ATTRIBUTE_PACKED after the closing } of the struct
marcozecchini 0:9fca2b23d0ba 155 * definition.
marcozecchini 0:9fca2b23d0ba 156 */
marcozecchini 0:9fca2b23d0ba 157 #define SL_PACK_END()
marcozecchini 0:9fca2b23d0ba 158
marcozecchini 0:9fca2b23d0ba 159 /** @brief GCC style macro for aligning a variable. */
marcozecchini 0:9fca2b23d0ba 160 #define SL_ATTRIBUTE_ALIGN(X) __attribute__ ((aligned(X)))
marcozecchini 0:9fca2b23d0ba 161
marcozecchini 0:9fca2b23d0ba 162 /** @brief Macro for aligning a variable.
marcozecchini 0:9fca2b23d0ba 163 * @n Use this macro before the variable definition.
marcozecchini 0:9fca2b23d0ba 164 * @n X denotes the storage alignment value in bytes.
marcozecchini 0:9fca2b23d0ba 165 * @n To be gcc compatible use SL_ATTRIBUTE_ALIGN(X) before the ; on normal
marcozecchini 0:9fca2b23d0ba 166 * variables. Use SL_ATTRIBUTE_ALIGN(X) before the opening { on struct variables.
marcozecchini 0:9fca2b23d0ba 167 */
marcozecchini 0:9fca2b23d0ba 168 #define SL_ALIGN(X)
marcozecchini 0:9fca2b23d0ba 169
marcozecchini 0:9fca2b23d0ba 170 /** @brief Macro for defining a weak symbol. */
marcozecchini 0:9fca2b23d0ba 171 #define SL_WEAK __attribute__ ((weak))
marcozecchini 0:9fca2b23d0ba 172
marcozecchini 0:9fca2b23d0ba 173 /** @brief Macro for handling non-returning functions. */
marcozecchini 0:9fca2b23d0ba 174 #define SL_NORETURN __attribute__ ((noreturn))
marcozecchini 0:9fca2b23d0ba 175
marcozecchini 0:9fca2b23d0ba 176 /** Macro for placing a variable in a section.
marcozecchini 0:9fca2b23d0ba 177 * @n Use this macro after the variable definition, before the = or ;.
marcozecchini 0:9fca2b23d0ba 178 * @n X denotes the section to place the variable in.
marcozecchini 0:9fca2b23d0ba 179 */
marcozecchini 0:9fca2b23d0ba 180 #define SL_ATTRIBUTE_SECTION(X) __attribute__ ((section(X)))
marcozecchini 0:9fca2b23d0ba 181
marcozecchini 0:9fca2b23d0ba 182 #endif // !defined(__GNUC__)
marcozecchini 0:9fca2b23d0ba 183
marcozecchini 0:9fca2b23d0ba 184 /***************************************************************************//**
marcozecchini 0:9fca2b23d0ba 185 * @brief
marcozecchini 0:9fca2b23d0ba 186 * Count trailing number of zeros. Use CLZ instruction if available.
marcozecchini 0:9fca2b23d0ba 187 *
marcozecchini 0:9fca2b23d0ba 188 * @param[in] value
marcozecchini 0:9fca2b23d0ba 189 * Data value to check for number of trailing zero bits.
marcozecchini 0:9fca2b23d0ba 190 *
marcozecchini 0:9fca2b23d0ba 191 * @return
marcozecchini 0:9fca2b23d0ba 192 * Number of trailing zeros in value.
marcozecchini 0:9fca2b23d0ba 193 ******************************************************************************/
marcozecchini 0:9fca2b23d0ba 194 __STATIC_INLINE uint32_t SL_CTZ(uint32_t value)
marcozecchini 0:9fca2b23d0ba 195 {
marcozecchini 0:9fca2b23d0ba 196 #if (__CORTEX_M >= 3)
marcozecchini 0:9fca2b23d0ba 197 return __CLZ(__RBIT(value));
marcozecchini 0:9fca2b23d0ba 198
marcozecchini 0:9fca2b23d0ba 199 #else
marcozecchini 0:9fca2b23d0ba 200 uint32_t zeros;
marcozecchini 0:9fca2b23d0ba 201 for(zeros=0; (zeros<32) && ((value&0x1) == 0); zeros++, value>>=1);
marcozecchini 0:9fca2b23d0ba 202 return zeros;
marcozecchini 0:9fca2b23d0ba 203 #endif
marcozecchini 0:9fca2b23d0ba 204 }
marcozecchini 0:9fca2b23d0ba 205
marcozecchini 0:9fca2b23d0ba 206
marcozecchini 0:9fca2b23d0ba 207 /* Deprecated function. New code should use @ref SL_CTZ. */
marcozecchini 0:9fca2b23d0ba 208 __STATIC_INLINE uint32_t EFM32_CTZ(uint32_t value)
marcozecchini 0:9fca2b23d0ba 209 {
marcozecchini 0:9fca2b23d0ba 210 return SL_CTZ(value);
marcozecchini 0:9fca2b23d0ba 211 }
marcozecchini 0:9fca2b23d0ba 212
marcozecchini 0:9fca2b23d0ba 213
marcozecchini 0:9fca2b23d0ba 214 /** @} (end addtogroup COMMON) */
marcozecchini 0:9fca2b23d0ba 215 /** @} (end addtogroup emlib) */
marcozecchini 0:9fca2b23d0ba 216
marcozecchini 0:9fca2b23d0ba 217 #ifdef __cplusplus
marcozecchini 0:9fca2b23d0ba 218 }
marcozecchini 0:9fca2b23d0ba 219 #endif
marcozecchini 0:9fca2b23d0ba 220
marcozecchini 0:9fca2b23d0ba 221 #endif /* EM_COMMON_H */