The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
mbed library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 171:3a7713b1edbc 1 #ifndef UTILS_COMPILER_H_INCLUDED
AnnaBridge 171:3a7713b1edbc 2 #define UTILS_COMPILER_H_INCLUDED
AnnaBridge 171:3a7713b1edbc 3
AnnaBridge 171:3a7713b1edbc 4 /**
AnnaBridge 171:3a7713b1edbc 5 * \defgroup group_sam0_utils Compiler abstraction layer and code utilities
AnnaBridge 171:3a7713b1edbc 6 *
AnnaBridge 171:3a7713b1edbc 7 * Compiler abstraction layer and code utilities for Cortex-M0+ based Atmel SAM devices.
AnnaBridge 171:3a7713b1edbc 8 * This module provides various abstraction layers and utilities to make code compatible between different compilers.
AnnaBridge 171:3a7713b1edbc 9 *
AnnaBridge 171:3a7713b1edbc 10 * @{
AnnaBridge 171:3a7713b1edbc 11 */
AnnaBridge 171:3a7713b1edbc 12
AnnaBridge 171:3a7713b1edbc 13 #if (defined __ICCARM__)
AnnaBridge 171:3a7713b1edbc 14 # include <intrinsics.h>
AnnaBridge 171:3a7713b1edbc 15 #endif
AnnaBridge 171:3a7713b1edbc 16
AnnaBridge 171:3a7713b1edbc 17 #include <stddef.h>
AnnaBridge 171:3a7713b1edbc 18 #include <parts.h>
AnnaBridge 171:3a7713b1edbc 19 #include <status_codes.h>
AnnaBridge 171:3a7713b1edbc 20 #include <preprocessor.h>
AnnaBridge 171:3a7713b1edbc 21 #include <io.h>
AnnaBridge 171:3a7713b1edbc 22
AnnaBridge 171:3a7713b1edbc 23 #ifndef __ASSEMBLY__
AnnaBridge 171:3a7713b1edbc 24
AnnaBridge 171:3a7713b1edbc 25 #include <stdio.h>
AnnaBridge 171:3a7713b1edbc 26 #include <stdbool.h>
AnnaBridge 171:3a7713b1edbc 27 #include <stdint.h>
AnnaBridge 171:3a7713b1edbc 28 #include <stdlib.h>
AnnaBridge 171:3a7713b1edbc 29
AnnaBridge 171:3a7713b1edbc 30 /**
AnnaBridge 171:3a7713b1edbc 31 * \def UNUSED
AnnaBridge 171:3a7713b1edbc 32 * \brief Marking \a v as a unused parameter or value.
AnnaBridge 171:3a7713b1edbc 33 */
AnnaBridge 171:3a7713b1edbc 34 #define UNUSED(v) (void)(v)
AnnaBridge 171:3a7713b1edbc 35
AnnaBridge 171:3a7713b1edbc 36 /**
AnnaBridge 171:3a7713b1edbc 37 * \def barrier
AnnaBridge 171:3a7713b1edbc 38 * \brief Memory barrier
AnnaBridge 171:3a7713b1edbc 39 */
AnnaBridge 171:3a7713b1edbc 40 #ifdef __GNUC__
AnnaBridge 171:3a7713b1edbc 41 # define barrier() asm volatile("" ::: "memory")
AnnaBridge 171:3a7713b1edbc 42 #else
AnnaBridge 171:3a7713b1edbc 43 # define barrier() asm ("")
AnnaBridge 171:3a7713b1edbc 44 #endif
AnnaBridge 171:3a7713b1edbc 45
AnnaBridge 171:3a7713b1edbc 46 /**
AnnaBridge 171:3a7713b1edbc 47 * \brief Emit the compiler pragma \a arg.
AnnaBridge 171:3a7713b1edbc 48 *
AnnaBridge 171:3a7713b1edbc 49 * \param[in] arg The pragma directive as it would appear after \e \#pragma
AnnaBridge 171:3a7713b1edbc 50 * (i.e. not stringified).
AnnaBridge 171:3a7713b1edbc 51 */
AnnaBridge 171:3a7713b1edbc 52 #define COMPILER_PRAGMA(arg) _Pragma(#arg)
AnnaBridge 171:3a7713b1edbc 53
AnnaBridge 171:3a7713b1edbc 54 /**
AnnaBridge 171:3a7713b1edbc 55 * \def COMPILER_PACK_SET(alignment)
AnnaBridge 171:3a7713b1edbc 56 * \brief Set maximum alignment for subsequent struct and union definitions to \a alignment.
AnnaBridge 171:3a7713b1edbc 57 */
AnnaBridge 171:3a7713b1edbc 58 #define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment))
AnnaBridge 171:3a7713b1edbc 59
AnnaBridge 171:3a7713b1edbc 60 /**
AnnaBridge 171:3a7713b1edbc 61 * \def COMPILER_PACK_RESET()
AnnaBridge 171:3a7713b1edbc 62 * \brief Set default alignment for subsequent struct and union definitions.
AnnaBridge 171:3a7713b1edbc 63 */
AnnaBridge 171:3a7713b1edbc 64 #define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
AnnaBridge 171:3a7713b1edbc 65
AnnaBridge 171:3a7713b1edbc 66
AnnaBridge 171:3a7713b1edbc 67 /**
AnnaBridge 171:3a7713b1edbc 68 * \brief Set aligned boundary.
AnnaBridge 171:3a7713b1edbc 69 */
AnnaBridge 171:3a7713b1edbc 70 #if (defined __GNUC__) || (defined __CC_ARM)
AnnaBridge 171:3a7713b1edbc 71 # define COMPILER_ALIGNED(a) __attribute__((__aligned__(a)))
AnnaBridge 171:3a7713b1edbc 72 #elif (defined __ICCARM__)
AnnaBridge 171:3a7713b1edbc 73 # define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a)
AnnaBridge 171:3a7713b1edbc 74 #endif
AnnaBridge 171:3a7713b1edbc 75
AnnaBridge 171:3a7713b1edbc 76 /**
AnnaBridge 171:3a7713b1edbc 77 * \brief Set word-aligned boundary.
AnnaBridge 171:3a7713b1edbc 78 */
AnnaBridge 171:3a7713b1edbc 79 #if (defined __GNUC__) || defined(__CC_ARM)
AnnaBridge 171:3a7713b1edbc 80 #define COMPILER_WORD_ALIGNED __attribute__((__aligned__(4)))
AnnaBridge 171:3a7713b1edbc 81 #elif (defined __ICCARM__)
AnnaBridge 171:3a7713b1edbc 82 #define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 4)
AnnaBridge 171:3a7713b1edbc 83 #endif
AnnaBridge 171:3a7713b1edbc 84
AnnaBridge 171:3a7713b1edbc 85 /**
AnnaBridge 171:3a7713b1edbc 86 * \def __always_inline
AnnaBridge 171:3a7713b1edbc 87 * \brief The function should always be inlined.
AnnaBridge 171:3a7713b1edbc 88 *
AnnaBridge 171:3a7713b1edbc 89 * This annotation instructs the compiler to ignore its inlining
AnnaBridge 171:3a7713b1edbc 90 * heuristics and inline the function no matter how big it thinks it
AnnaBridge 171:3a7713b1edbc 91 * becomes.
AnnaBridge 171:3a7713b1edbc 92 */
AnnaBridge 171:3a7713b1edbc 93 #if defined(__CC_ARM)
AnnaBridge 171:3a7713b1edbc 94 # define __always_inline __forceinline
AnnaBridge 171:3a7713b1edbc 95 #elif (defined __GNUC__)
AnnaBridge 171:3a7713b1edbc 96 # define __always_inline __attribute__((__always_inline__))
AnnaBridge 171:3a7713b1edbc 97 #elif (defined __ICCARM__)
AnnaBridge 171:3a7713b1edbc 98 # define __always_inline _Pragma("inline=forced")
AnnaBridge 171:3a7713b1edbc 99 #endif
AnnaBridge 171:3a7713b1edbc 100
AnnaBridge 171:3a7713b1edbc 101 /**
AnnaBridge 171:3a7713b1edbc 102 * \def __no_inline
AnnaBridge 171:3a7713b1edbc 103 * \brief The function should never be inlined
AnnaBridge 171:3a7713b1edbc 104 *
AnnaBridge 171:3a7713b1edbc 105 * This annotation instructs the compiler to ignore its inlining
AnnaBridge 171:3a7713b1edbc 106 * heuristics and not inline the function no matter how small it thinks it
AnnaBridge 171:3a7713b1edbc 107 * becomes.
AnnaBridge 171:3a7713b1edbc 108 */
AnnaBridge 171:3a7713b1edbc 109 #if defined(__CC_ARM)
AnnaBridge 171:3a7713b1edbc 110 # define __no_inline __attribute__((noinline))
AnnaBridge 171:3a7713b1edbc 111 #elif (defined __GNUC__)
AnnaBridge 171:3a7713b1edbc 112 # define __no_inline __attribute__((noinline))
AnnaBridge 171:3a7713b1edbc 113 #elif (defined __ICCARM__)
AnnaBridge 171:3a7713b1edbc 114 # define __no_inline _Pragma("inline=never")
AnnaBridge 171:3a7713b1edbc 115 #endif
AnnaBridge 171:3a7713b1edbc 116
AnnaBridge 171:3a7713b1edbc 117
AnnaBridge 171:3a7713b1edbc 118 /** \brief This macro is used to test fatal errors.
AnnaBridge 171:3a7713b1edbc 119 *
AnnaBridge 171:3a7713b1edbc 120 * The macro tests if the expression is false. If it is, a fatal error is
AnnaBridge 171:3a7713b1edbc 121 * detected and the application hangs up. If \c TEST_SUITE_DEFINE_ASSERT_MACRO
AnnaBridge 171:3a7713b1edbc 122 * is defined, a unit test version of the macro is used, to allow execution
AnnaBridge 171:3a7713b1edbc 123 * of further tests after a false expression.
AnnaBridge 171:3a7713b1edbc 124 *
AnnaBridge 171:3a7713b1edbc 125 * \param[in] expr Expression to evaluate and supposed to be nonzero.
AnnaBridge 171:3a7713b1edbc 126 */
AnnaBridge 171:3a7713b1edbc 127 #if defined(_ASSERT_ENABLE_)
AnnaBridge 171:3a7713b1edbc 128 # if defined(TEST_SUITE_DEFINE_ASSERT_MACRO)
AnnaBridge 171:3a7713b1edbc 129 # include "unit_test/suite.h"
AnnaBridge 171:3a7713b1edbc 130 # else
AnnaBridge 171:3a7713b1edbc 131 # undef TEST_SUITE_DEFINE_ASSERT_MACRO
AnnaBridge 171:3a7713b1edbc 132 # define Assert(expr) \
AnnaBridge 171:3a7713b1edbc 133 {\
AnnaBridge 171:3a7713b1edbc 134 if (!(expr)) asm("BKPT #0");\
AnnaBridge 171:3a7713b1edbc 135 }
AnnaBridge 171:3a7713b1edbc 136 # endif
AnnaBridge 171:3a7713b1edbc 137 #else
AnnaBridge 171:3a7713b1edbc 138 # define Assert(expr) ((void) 0)
AnnaBridge 171:3a7713b1edbc 139 #endif
AnnaBridge 171:3a7713b1edbc 140
AnnaBridge 171:3a7713b1edbc 141 /* Define WEAK attribute */
AnnaBridge 171:3a7713b1edbc 142 //defined in toochain.h
AnnaBridge 171:3a7713b1edbc 143 //#if defined ( __CC_ARM )
AnnaBridge 171:3a7713b1edbc 144 //# define WEAK __attribute__ ((weak))
AnnaBridge 171:3a7713b1edbc 145 //#elif defined ( __ICCARM__ )
AnnaBridge 171:3a7713b1edbc 146 //# define WEAK __weak
AnnaBridge 171:3a7713b1edbc 147 //#elif defined ( __GNUC__ )
AnnaBridge 171:3a7713b1edbc 148 //# define WEAK __attribute__ ((weak))
AnnaBridge 171:3a7713b1edbc 149 //#endif
AnnaBridge 171:3a7713b1edbc 150
AnnaBridge 171:3a7713b1edbc 151 /* Define NO_INIT attribute */
AnnaBridge 171:3a7713b1edbc 152 #if defined ( __CC_ARM )
AnnaBridge 171:3a7713b1edbc 153 # define NO_INIT __attribute__((zero_init))
AnnaBridge 171:3a7713b1edbc 154 #elif defined ( __ICCARM__ )
AnnaBridge 171:3a7713b1edbc 155 # define NO_INIT __no_init
AnnaBridge 171:3a7713b1edbc 156 #elif defined ( __GNUC__ )
AnnaBridge 171:3a7713b1edbc 157 # define NO_INIT __attribute__((section(".no_init")))
AnnaBridge 171:3a7713b1edbc 158 #endif
AnnaBridge 171:3a7713b1edbc 159
AnnaBridge 171:3a7713b1edbc 160 #include "interrupt.h"
AnnaBridge 171:3a7713b1edbc 161
AnnaBridge 171:3a7713b1edbc 162 /** \name Usual Types
AnnaBridge 171:3a7713b1edbc 163 * @{ */
AnnaBridge 171:3a7713b1edbc 164 #ifndef __cplusplus
AnnaBridge 171:3a7713b1edbc 165 # if !defined(__bool_true_false_are_defined)
AnnaBridge 171:3a7713b1edbc 166 typedef unsigned char bool;
AnnaBridge 171:3a7713b1edbc 167 # endif
AnnaBridge 171:3a7713b1edbc 168 #endif
AnnaBridge 171:3a7713b1edbc 169 typedef uint16_t le16_t;
AnnaBridge 171:3a7713b1edbc 170 typedef uint16_t be16_t;
AnnaBridge 171:3a7713b1edbc 171 typedef uint32_t le32_t;
AnnaBridge 171:3a7713b1edbc 172 typedef uint32_t be32_t;
AnnaBridge 171:3a7713b1edbc 173 typedef uint32_t iram_size_t;
AnnaBridge 171:3a7713b1edbc 174 /** @} */
AnnaBridge 171:3a7713b1edbc 175
AnnaBridge 171:3a7713b1edbc 176 /** \name Aliasing Aggregate Types
AnnaBridge 171:3a7713b1edbc 177 * @{ */
AnnaBridge 171:3a7713b1edbc 178
AnnaBridge 171:3a7713b1edbc 179 /** 16-bit union. */
AnnaBridge 171:3a7713b1edbc 180 typedef union {
AnnaBridge 171:3a7713b1edbc 181 int16_t s16;
AnnaBridge 171:3a7713b1edbc 182 uint16_t u16;
AnnaBridge 171:3a7713b1edbc 183 int8_t s8[2];
AnnaBridge 171:3a7713b1edbc 184 uint8_t u8[2];
AnnaBridge 171:3a7713b1edbc 185 } Union16;
AnnaBridge 171:3a7713b1edbc 186
AnnaBridge 171:3a7713b1edbc 187 /** 32-bit union. */
AnnaBridge 171:3a7713b1edbc 188 typedef union {
AnnaBridge 171:3a7713b1edbc 189 int32_t s32;
AnnaBridge 171:3a7713b1edbc 190 uint32_t u32;
AnnaBridge 171:3a7713b1edbc 191 int16_t s16[2];
AnnaBridge 171:3a7713b1edbc 192 uint16_t u16[2];
AnnaBridge 171:3a7713b1edbc 193 int8_t s8[4];
AnnaBridge 171:3a7713b1edbc 194 uint8_t u8[4];
AnnaBridge 171:3a7713b1edbc 195 } Union32;
AnnaBridge 171:3a7713b1edbc 196
AnnaBridge 171:3a7713b1edbc 197 /** 64-bit union. */
AnnaBridge 171:3a7713b1edbc 198 typedef union {
AnnaBridge 171:3a7713b1edbc 199 int64_t s64;
AnnaBridge 171:3a7713b1edbc 200 uint64_t u64;
AnnaBridge 171:3a7713b1edbc 201 int32_t s32[2];
AnnaBridge 171:3a7713b1edbc 202 uint32_t u32[2];
AnnaBridge 171:3a7713b1edbc 203 int16_t s16[4];
AnnaBridge 171:3a7713b1edbc 204 uint16_t u16[4];
AnnaBridge 171:3a7713b1edbc 205 int8_t s8[8];
AnnaBridge 171:3a7713b1edbc 206 uint8_t u8[8];
AnnaBridge 171:3a7713b1edbc 207 } Union64;
AnnaBridge 171:3a7713b1edbc 208
AnnaBridge 171:3a7713b1edbc 209 /** Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 210 typedef union {
AnnaBridge 171:3a7713b1edbc 211 int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 212 uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 213 int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 214 uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 215 int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 216 uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 217 int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 218 uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 219 } UnionPtr;
AnnaBridge 171:3a7713b1edbc 220
AnnaBridge 171:3a7713b1edbc 221 /** Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 222 typedef union {
AnnaBridge 171:3a7713b1edbc 223 volatile int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 224 volatile uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 225 volatile int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 226 volatile uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 227 volatile int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 228 volatile uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 229 volatile int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 230 volatile uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 231 } UnionVPtr;
AnnaBridge 171:3a7713b1edbc 232
AnnaBridge 171:3a7713b1edbc 233 /** Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 234 typedef union {
AnnaBridge 171:3a7713b1edbc 235 const int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 236 const uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 237 const int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 238 const uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 239 const int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 240 const uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 241 const int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 242 const uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 243 } UnionCPtr;
AnnaBridge 171:3a7713b1edbc 244
AnnaBridge 171:3a7713b1edbc 245 /** Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 246 typedef union {
AnnaBridge 171:3a7713b1edbc 247 const volatile int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 248 const volatile uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 249 const volatile int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 250 const volatile uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 251 const volatile int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 252 const volatile uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 253 const volatile int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 254 const volatile uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 255 } UnionCVPtr;
AnnaBridge 171:3a7713b1edbc 256
AnnaBridge 171:3a7713b1edbc 257 /** Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 258 typedef struct {
AnnaBridge 171:3a7713b1edbc 259 int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 260 uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 261 int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 262 uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 263 int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 264 uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 265 int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 266 uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 267 } StructPtr;
AnnaBridge 171:3a7713b1edbc 268
AnnaBridge 171:3a7713b1edbc 269 /** Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 270 typedef struct {
AnnaBridge 171:3a7713b1edbc 271 volatile int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 272 volatile uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 273 volatile int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 274 volatile uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 275 volatile int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 276 volatile uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 277 volatile int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 278 volatile uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 279 } StructVPtr;
AnnaBridge 171:3a7713b1edbc 280
AnnaBridge 171:3a7713b1edbc 281 /** Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 282 typedef struct {
AnnaBridge 171:3a7713b1edbc 283 const int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 284 const uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 285 const int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 286 const uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 287 const int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 288 const uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 289 const int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 290 const uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 291 } StructCPtr;
AnnaBridge 171:3a7713b1edbc 292
AnnaBridge 171:3a7713b1edbc 293 /** Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. */
AnnaBridge 171:3a7713b1edbc 294 typedef struct {
AnnaBridge 171:3a7713b1edbc 295 const volatile int64_t *s64ptr;
AnnaBridge 171:3a7713b1edbc 296 const volatile uint64_t *u64ptr;
AnnaBridge 171:3a7713b1edbc 297 const volatile int32_t *s32ptr;
AnnaBridge 171:3a7713b1edbc 298 const volatile uint32_t *u32ptr;
AnnaBridge 171:3a7713b1edbc 299 const volatile int16_t *s16ptr;
AnnaBridge 171:3a7713b1edbc 300 const volatile uint16_t *u16ptr;
AnnaBridge 171:3a7713b1edbc 301 const volatile int8_t *s8ptr;
AnnaBridge 171:3a7713b1edbc 302 const volatile uint8_t *u8ptr;
AnnaBridge 171:3a7713b1edbc 303 } StructCVPtr;
AnnaBridge 171:3a7713b1edbc 304
AnnaBridge 171:3a7713b1edbc 305 /** @} */
AnnaBridge 171:3a7713b1edbc 306
AnnaBridge 171:3a7713b1edbc 307 #endif /* #ifndef __ASSEMBLY__ */
AnnaBridge 171:3a7713b1edbc 308
AnnaBridge 171:3a7713b1edbc 309 /** \name Usual Constants
AnnaBridge 171:3a7713b1edbc 310 * @{ */
AnnaBridge 171:3a7713b1edbc 311 #define DISABLE 0
AnnaBridge 171:3a7713b1edbc 312 #define ENABLE 1
AnnaBridge 171:3a7713b1edbc 313
AnnaBridge 171:3a7713b1edbc 314 #ifndef __cplusplus
AnnaBridge 171:3a7713b1edbc 315 # if !defined(__bool_true_false_are_defined)
AnnaBridge 171:3a7713b1edbc 316 # define false 0
AnnaBridge 171:3a7713b1edbc 317 # define true 1
AnnaBridge 171:3a7713b1edbc 318 # endif
AnnaBridge 171:3a7713b1edbc 319 #endif
AnnaBridge 171:3a7713b1edbc 320 /** @} */
AnnaBridge 171:3a7713b1edbc 321
AnnaBridge 171:3a7713b1edbc 322 #ifndef __ASSEMBLY__
AnnaBridge 171:3a7713b1edbc 323
AnnaBridge 171:3a7713b1edbc 324 /** \name Optimization Control
AnnaBridge 171:3a7713b1edbc 325 * @{ */
AnnaBridge 171:3a7713b1edbc 326
AnnaBridge 171:3a7713b1edbc 327 /**
AnnaBridge 171:3a7713b1edbc 328 * \def likely(exp)
AnnaBridge 171:3a7713b1edbc 329 * \brief The expression \a exp is likely to be true
AnnaBridge 171:3a7713b1edbc 330 */
AnnaBridge 171:3a7713b1edbc 331 #if !defined(likely) || defined(__DOXYGEN__)
AnnaBridge 171:3a7713b1edbc 332 # define likely(exp) (exp)
AnnaBridge 171:3a7713b1edbc 333 #endif
AnnaBridge 171:3a7713b1edbc 334
AnnaBridge 171:3a7713b1edbc 335 /**
AnnaBridge 171:3a7713b1edbc 336 * \def unlikely(exp)
AnnaBridge 171:3a7713b1edbc 337 * \brief The expression \a exp is unlikely to be true
AnnaBridge 171:3a7713b1edbc 338 */
AnnaBridge 171:3a7713b1edbc 339 #if !defined(unlikely) || defined(__DOXYGEN__)
AnnaBridge 171:3a7713b1edbc 340 # define unlikely(exp) (exp)
AnnaBridge 171:3a7713b1edbc 341 #endif
AnnaBridge 171:3a7713b1edbc 342
AnnaBridge 171:3a7713b1edbc 343 /**
AnnaBridge 171:3a7713b1edbc 344 * \def is_constant(exp)
AnnaBridge 171:3a7713b1edbc 345 * \brief Determine if an expression evaluates to a constant value.
AnnaBridge 171:3a7713b1edbc 346 *
AnnaBridge 171:3a7713b1edbc 347 * \param[in] exp Any expression
AnnaBridge 171:3a7713b1edbc 348 *
AnnaBridge 171:3a7713b1edbc 349 * \return true if \a exp is constant, false otherwise.
AnnaBridge 171:3a7713b1edbc 350 */
AnnaBridge 171:3a7713b1edbc 351 #if (defined __GNUC__) || (defined __CC_ARM)
AnnaBridge 171:3a7713b1edbc 352 # define is_constant(exp) __builtin_constant_p(exp)
AnnaBridge 171:3a7713b1edbc 353 #else
AnnaBridge 171:3a7713b1edbc 354 # define is_constant(exp) (0)
AnnaBridge 171:3a7713b1edbc 355 #endif
AnnaBridge 171:3a7713b1edbc 356
AnnaBridge 171:3a7713b1edbc 357 /** @} */
AnnaBridge 171:3a7713b1edbc 358
AnnaBridge 171:3a7713b1edbc 359 /** \name Bit-Field Handling
AnnaBridge 171:3a7713b1edbc 360 * @{ */
AnnaBridge 171:3a7713b1edbc 361
AnnaBridge 171:3a7713b1edbc 362 /** \brief Reads the bits of a value specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 363 *
AnnaBridge 171:3a7713b1edbc 364 * \param[in] value Value to read bits from.
AnnaBridge 171:3a7713b1edbc 365 * \param[in] mask Bit-mask indicating bits to read.
AnnaBridge 171:3a7713b1edbc 366 *
AnnaBridge 171:3a7713b1edbc 367 * \return Read bits.
AnnaBridge 171:3a7713b1edbc 368 */
AnnaBridge 171:3a7713b1edbc 369 #define Rd_bits( value, mask) ((value) & (mask))
AnnaBridge 171:3a7713b1edbc 370
AnnaBridge 171:3a7713b1edbc 371 /** \brief Writes the bits of a C lvalue specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 372 *
AnnaBridge 171:3a7713b1edbc 373 * \param[in] lvalue C lvalue to write bits to.
AnnaBridge 171:3a7713b1edbc 374 * \param[in] mask Bit-mask indicating bits to write.
AnnaBridge 171:3a7713b1edbc 375 * \param[in] bits Bits to write.
AnnaBridge 171:3a7713b1edbc 376 *
AnnaBridge 171:3a7713b1edbc 377 * \return Resulting value with written bits.
AnnaBridge 171:3a7713b1edbc 378 */
AnnaBridge 171:3a7713b1edbc 379 #define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\
AnnaBridge 171:3a7713b1edbc 380 ((bits ) & (mask)))
AnnaBridge 171:3a7713b1edbc 381
AnnaBridge 171:3a7713b1edbc 382 /** \brief Tests the bits of a value specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 383 *
AnnaBridge 171:3a7713b1edbc 384 * \param[in] value Value of which to test bits.
AnnaBridge 171:3a7713b1edbc 385 * \param[in] mask Bit-mask indicating bits to test.
AnnaBridge 171:3a7713b1edbc 386 *
AnnaBridge 171:3a7713b1edbc 387 * \return \c 1 if at least one of the tested bits is set, else \c 0.
AnnaBridge 171:3a7713b1edbc 388 */
AnnaBridge 171:3a7713b1edbc 389 #define Tst_bits( value, mask) (Rd_bits(value, mask) != 0)
AnnaBridge 171:3a7713b1edbc 390
AnnaBridge 171:3a7713b1edbc 391 /** \brief Clears the bits of a C lvalue specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 392 *
AnnaBridge 171:3a7713b1edbc 393 * \param[in] lvalue C lvalue of which to clear bits.
AnnaBridge 171:3a7713b1edbc 394 * \param[in] mask Bit-mask indicating bits to clear.
AnnaBridge 171:3a7713b1edbc 395 *
AnnaBridge 171:3a7713b1edbc 396 * \return Resulting value with cleared bits.
AnnaBridge 171:3a7713b1edbc 397 */
AnnaBridge 171:3a7713b1edbc 398 #define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask))
AnnaBridge 171:3a7713b1edbc 399
AnnaBridge 171:3a7713b1edbc 400 /** \brief Sets the bits of a C lvalue specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 401 *
AnnaBridge 171:3a7713b1edbc 402 * \param[in] lvalue C lvalue of which to set bits.
AnnaBridge 171:3a7713b1edbc 403 * \param[in] mask Bit-mask indicating bits to set.
AnnaBridge 171:3a7713b1edbc 404 *
AnnaBridge 171:3a7713b1edbc 405 * \return Resulting value with set bits.
AnnaBridge 171:3a7713b1edbc 406 */
AnnaBridge 171:3a7713b1edbc 407 #define Set_bits(lvalue, mask) ((lvalue) |= (mask))
AnnaBridge 171:3a7713b1edbc 408
AnnaBridge 171:3a7713b1edbc 409 /** \brief Toggles the bits of a C lvalue specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 410 *
AnnaBridge 171:3a7713b1edbc 411 * \param[in] lvalue C lvalue of which to toggle bits.
AnnaBridge 171:3a7713b1edbc 412 * \param[in] mask Bit-mask indicating bits to toggle.
AnnaBridge 171:3a7713b1edbc 413 *
AnnaBridge 171:3a7713b1edbc 414 * \return Resulting value with toggled bits.
AnnaBridge 171:3a7713b1edbc 415 */
AnnaBridge 171:3a7713b1edbc 416 #define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask))
AnnaBridge 171:3a7713b1edbc 417
AnnaBridge 171:3a7713b1edbc 418 /** \brief Reads the bit-field of a value specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 419 *
AnnaBridge 171:3a7713b1edbc 420 * \param[in] value Value to read a bit-field from.
AnnaBridge 171:3a7713b1edbc 421 * \param[in] mask Bit-mask indicating the bit-field to read.
AnnaBridge 171:3a7713b1edbc 422 *
AnnaBridge 171:3a7713b1edbc 423 * \return Read bit-field.
AnnaBridge 171:3a7713b1edbc 424 */
AnnaBridge 171:3a7713b1edbc 425 #define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask))
AnnaBridge 171:3a7713b1edbc 426
AnnaBridge 171:3a7713b1edbc 427 /** \brief Writes the bit-field of a C lvalue specified by a given bit-mask.
AnnaBridge 171:3a7713b1edbc 428 *
AnnaBridge 171:3a7713b1edbc 429 * \param[in] lvalue C lvalue to write a bit-field to.
AnnaBridge 171:3a7713b1edbc 430 * \param[in] mask Bit-mask indicating the bit-field to write.
AnnaBridge 171:3a7713b1edbc 431 * \param[in] bitfield Bit-field to write.
AnnaBridge 171:3a7713b1edbc 432 *
AnnaBridge 171:3a7713b1edbc 433 * \return Resulting value with written bit-field.
AnnaBridge 171:3a7713b1edbc 434 */
AnnaBridge 171:3a7713b1edbc 435 #define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (uint32_t)(bitfield) << ctz(mask)))
AnnaBridge 171:3a7713b1edbc 436
AnnaBridge 171:3a7713b1edbc 437 /** @} */
AnnaBridge 171:3a7713b1edbc 438
AnnaBridge 171:3a7713b1edbc 439
AnnaBridge 171:3a7713b1edbc 440 /** \name Zero-Bit Counting
AnnaBridge 171:3a7713b1edbc 441 *
AnnaBridge 171:3a7713b1edbc 442 * Under GCC, __builtin_clz and __builtin_ctz behave like macros when
AnnaBridge 171:3a7713b1edbc 443 * applied to constant expressions (values known at compile time), so they are
AnnaBridge 171:3a7713b1edbc 444 * more optimized than the use of the corresponding assembly instructions and
AnnaBridge 171:3a7713b1edbc 445 * they can be used as constant expressions e.g. to initialize objects having
AnnaBridge 171:3a7713b1edbc 446 * static storage duration, and like the corresponding assembly instructions
AnnaBridge 171:3a7713b1edbc 447 * when applied to non-constant expressions (values unknown at compile time), so
AnnaBridge 171:3a7713b1edbc 448 * they are more optimized than an assembly periphrasis. Hence, clz and ctz
AnnaBridge 171:3a7713b1edbc 449 * ensure a possible and optimized behavior for both constant and non-constant
AnnaBridge 171:3a7713b1edbc 450 * expressions.
AnnaBridge 171:3a7713b1edbc 451 *
AnnaBridge 171:3a7713b1edbc 452 * @{ */
AnnaBridge 171:3a7713b1edbc 453
AnnaBridge 171:3a7713b1edbc 454 /** \brief Counts the leading zero bits of the given value considered as a 32-bit integer.
AnnaBridge 171:3a7713b1edbc 455 *
AnnaBridge 171:3a7713b1edbc 456 * \param[in] u Value of which to count the leading zero bits.
AnnaBridge 171:3a7713b1edbc 457 *
AnnaBridge 171:3a7713b1edbc 458 * \return The count of leading zero bits in \a u.
AnnaBridge 171:3a7713b1edbc 459 */
AnnaBridge 171:3a7713b1edbc 460 #if (defined __GNUC__) || (defined __CC_ARM)
AnnaBridge 171:3a7713b1edbc 461 # define clz(u) __builtin_clz(u)
AnnaBridge 171:3a7713b1edbc 462 #else
AnnaBridge 171:3a7713b1edbc 463 # define clz(u) (((u) == 0) ? 32 : \
AnnaBridge 171:3a7713b1edbc 464 ((u) & (1ul << 31)) ? 0 : \
AnnaBridge 171:3a7713b1edbc 465 ((u) & (1ul << 30)) ? 1 : \
AnnaBridge 171:3a7713b1edbc 466 ((u) & (1ul << 29)) ? 2 : \
AnnaBridge 171:3a7713b1edbc 467 ((u) & (1ul << 28)) ? 3 : \
AnnaBridge 171:3a7713b1edbc 468 ((u) & (1ul << 27)) ? 4 : \
AnnaBridge 171:3a7713b1edbc 469 ((u) & (1ul << 26)) ? 5 : \
AnnaBridge 171:3a7713b1edbc 470 ((u) & (1ul << 25)) ? 6 : \
AnnaBridge 171:3a7713b1edbc 471 ((u) & (1ul << 24)) ? 7 : \
AnnaBridge 171:3a7713b1edbc 472 ((u) & (1ul << 23)) ? 8 : \
AnnaBridge 171:3a7713b1edbc 473 ((u) & (1ul << 22)) ? 9 : \
AnnaBridge 171:3a7713b1edbc 474 ((u) & (1ul << 21)) ? 10 : \
AnnaBridge 171:3a7713b1edbc 475 ((u) & (1ul << 20)) ? 11 : \
AnnaBridge 171:3a7713b1edbc 476 ((u) & (1ul << 19)) ? 12 : \
AnnaBridge 171:3a7713b1edbc 477 ((u) & (1ul << 18)) ? 13 : \
AnnaBridge 171:3a7713b1edbc 478 ((u) & (1ul << 17)) ? 14 : \
AnnaBridge 171:3a7713b1edbc 479 ((u) & (1ul << 16)) ? 15 : \
AnnaBridge 171:3a7713b1edbc 480 ((u) & (1ul << 15)) ? 16 : \
AnnaBridge 171:3a7713b1edbc 481 ((u) & (1ul << 14)) ? 17 : \
AnnaBridge 171:3a7713b1edbc 482 ((u) & (1ul << 13)) ? 18 : \
AnnaBridge 171:3a7713b1edbc 483 ((u) & (1ul << 12)) ? 19 : \
AnnaBridge 171:3a7713b1edbc 484 ((u) & (1ul << 11)) ? 20 : \
AnnaBridge 171:3a7713b1edbc 485 ((u) & (1ul << 10)) ? 21 : \
AnnaBridge 171:3a7713b1edbc 486 ((u) & (1ul << 9)) ? 22 : \
AnnaBridge 171:3a7713b1edbc 487 ((u) & (1ul << 8)) ? 23 : \
AnnaBridge 171:3a7713b1edbc 488 ((u) & (1ul << 7)) ? 24 : \
AnnaBridge 171:3a7713b1edbc 489 ((u) & (1ul << 6)) ? 25 : \
AnnaBridge 171:3a7713b1edbc 490 ((u) & (1ul << 5)) ? 26 : \
AnnaBridge 171:3a7713b1edbc 491 ((u) & (1ul << 4)) ? 27 : \
AnnaBridge 171:3a7713b1edbc 492 ((u) & (1ul << 3)) ? 28 : \
AnnaBridge 171:3a7713b1edbc 493 ((u) & (1ul << 2)) ? 29 : \
AnnaBridge 171:3a7713b1edbc 494 ((u) & (1ul << 1)) ? 30 : \
AnnaBridge 171:3a7713b1edbc 495 31)
AnnaBridge 171:3a7713b1edbc 496 #endif
AnnaBridge 171:3a7713b1edbc 497
AnnaBridge 171:3a7713b1edbc 498 /** \brief Counts the trailing zero bits of the given value considered as a 32-bit integer.
AnnaBridge 171:3a7713b1edbc 499 *
AnnaBridge 171:3a7713b1edbc 500 * \param[in] u Value of which to count the trailing zero bits.
AnnaBridge 171:3a7713b1edbc 501 *
AnnaBridge 171:3a7713b1edbc 502 * \return The count of trailing zero bits in \a u.
AnnaBridge 171:3a7713b1edbc 503 */
AnnaBridge 171:3a7713b1edbc 504 #if (defined __GNUC__) || (defined __CC_ARM)
AnnaBridge 171:3a7713b1edbc 505 # define ctz(u) __builtin_ctz(u)
AnnaBridge 171:3a7713b1edbc 506 #else
AnnaBridge 171:3a7713b1edbc 507 # define ctz(u) ((u) & (1ul << 0) ? 0 : \
AnnaBridge 171:3a7713b1edbc 508 (u) & (1ul << 1) ? 1 : \
AnnaBridge 171:3a7713b1edbc 509 (u) & (1ul << 2) ? 2 : \
AnnaBridge 171:3a7713b1edbc 510 (u) & (1ul << 3) ? 3 : \
AnnaBridge 171:3a7713b1edbc 511 (u) & (1ul << 4) ? 4 : \
AnnaBridge 171:3a7713b1edbc 512 (u) & (1ul << 5) ? 5 : \
AnnaBridge 171:3a7713b1edbc 513 (u) & (1ul << 6) ? 6 : \
AnnaBridge 171:3a7713b1edbc 514 (u) & (1ul << 7) ? 7 : \
AnnaBridge 171:3a7713b1edbc 515 (u) & (1ul << 8) ? 8 : \
AnnaBridge 171:3a7713b1edbc 516 (u) & (1ul << 9) ? 9 : \
AnnaBridge 171:3a7713b1edbc 517 (u) & (1ul << 10) ? 10 : \
AnnaBridge 171:3a7713b1edbc 518 (u) & (1ul << 11) ? 11 : \
AnnaBridge 171:3a7713b1edbc 519 (u) & (1ul << 12) ? 12 : \
AnnaBridge 171:3a7713b1edbc 520 (u) & (1ul << 13) ? 13 : \
AnnaBridge 171:3a7713b1edbc 521 (u) & (1ul << 14) ? 14 : \
AnnaBridge 171:3a7713b1edbc 522 (u) & (1ul << 15) ? 15 : \
AnnaBridge 171:3a7713b1edbc 523 (u) & (1ul << 16) ? 16 : \
AnnaBridge 171:3a7713b1edbc 524 (u) & (1ul << 17) ? 17 : \
AnnaBridge 171:3a7713b1edbc 525 (u) & (1ul << 18) ? 18 : \
AnnaBridge 171:3a7713b1edbc 526 (u) & (1ul << 19) ? 19 : \
AnnaBridge 171:3a7713b1edbc 527 (u) & (1ul << 20) ? 20 : \
AnnaBridge 171:3a7713b1edbc 528 (u) & (1ul << 21) ? 21 : \
AnnaBridge 171:3a7713b1edbc 529 (u) & (1ul << 22) ? 22 : \
AnnaBridge 171:3a7713b1edbc 530 (u) & (1ul << 23) ? 23 : \
AnnaBridge 171:3a7713b1edbc 531 (u) & (1ul << 24) ? 24 : \
AnnaBridge 171:3a7713b1edbc 532 (u) & (1ul << 25) ? 25 : \
AnnaBridge 171:3a7713b1edbc 533 (u) & (1ul << 26) ? 26 : \
AnnaBridge 171:3a7713b1edbc 534 (u) & (1ul << 27) ? 27 : \
AnnaBridge 171:3a7713b1edbc 535 (u) & (1ul << 28) ? 28 : \
AnnaBridge 171:3a7713b1edbc 536 (u) & (1ul << 29) ? 29 : \
AnnaBridge 171:3a7713b1edbc 537 (u) & (1ul << 30) ? 30 : \
AnnaBridge 171:3a7713b1edbc 538 (u) & (1ul << 31) ? 31 : \
AnnaBridge 171:3a7713b1edbc 539 32)
AnnaBridge 171:3a7713b1edbc 540 #endif
AnnaBridge 171:3a7713b1edbc 541
AnnaBridge 171:3a7713b1edbc 542 /** @} */
AnnaBridge 171:3a7713b1edbc 543
AnnaBridge 171:3a7713b1edbc 544
AnnaBridge 171:3a7713b1edbc 545 /** \name Bit Reversing
AnnaBridge 171:3a7713b1edbc 546 * @{ */
AnnaBridge 171:3a7713b1edbc 547
AnnaBridge 171:3a7713b1edbc 548 /** \brief Reverses the bits of \a u8.
AnnaBridge 171:3a7713b1edbc 549 *
AnnaBridge 171:3a7713b1edbc 550 * \param[in] u8 U8 of which to reverse the bits.
AnnaBridge 171:3a7713b1edbc 551 *
AnnaBridge 171:3a7713b1edbc 552 * \return Value resulting from \a u8 with reversed bits.
AnnaBridge 171:3a7713b1edbc 553 */
AnnaBridge 171:3a7713b1edbc 554 #define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24))
AnnaBridge 171:3a7713b1edbc 555
AnnaBridge 171:3a7713b1edbc 556 /** \brief Reverses the bits of \a u16.
AnnaBridge 171:3a7713b1edbc 557 *
AnnaBridge 171:3a7713b1edbc 558 * \param[in] u16 U16 of which to reverse the bits.
AnnaBridge 171:3a7713b1edbc 559 *
AnnaBridge 171:3a7713b1edbc 560 * \return Value resulting from \a u16 with reversed bits.
AnnaBridge 171:3a7713b1edbc 561 */
AnnaBridge 171:3a7713b1edbc 562 #define bit_reverse16(u16) ((uint16_t)(bit_reverse32((uint16_t)(u16)) >> 16))
AnnaBridge 171:3a7713b1edbc 563
AnnaBridge 171:3a7713b1edbc 564 /** \brief Reverses the bits of \a u32.
AnnaBridge 171:3a7713b1edbc 565 *
AnnaBridge 171:3a7713b1edbc 566 * \param[in] u32 U32 of which to reverse the bits.
AnnaBridge 171:3a7713b1edbc 567 *
AnnaBridge 171:3a7713b1edbc 568 * \return Value resulting from \a u32 with reversed bits.
AnnaBridge 171:3a7713b1edbc 569 */
AnnaBridge 171:3a7713b1edbc 570 #define bit_reverse32(u32) __RBIT(u32)
AnnaBridge 171:3a7713b1edbc 571
AnnaBridge 171:3a7713b1edbc 572 /** \brief Reverses the bits of \a u64.
AnnaBridge 171:3a7713b1edbc 573 *
AnnaBridge 171:3a7713b1edbc 574 * \param[in] u64 U64 of which to reverse the bits.
AnnaBridge 171:3a7713b1edbc 575 *
AnnaBridge 171:3a7713b1edbc 576 * \return Value resulting from \a u64 with reversed bits.
AnnaBridge 171:3a7713b1edbc 577 */
AnnaBridge 171:3a7713b1edbc 578 #define bit_reverse64(u64) ((uint64_t)(((uint64_t)bit_reverse32((uint64_t)(u64) >> 32)) |\
AnnaBridge 171:3a7713b1edbc 579 ((uint64_t)bit_reverse32((uint64_t)(u64)) << 32)))
AnnaBridge 171:3a7713b1edbc 580
AnnaBridge 171:3a7713b1edbc 581 /** @} */
AnnaBridge 171:3a7713b1edbc 582
AnnaBridge 171:3a7713b1edbc 583
AnnaBridge 171:3a7713b1edbc 584 /** \name Alignment
AnnaBridge 171:3a7713b1edbc 585 * @{ */
AnnaBridge 171:3a7713b1edbc 586
AnnaBridge 171:3a7713b1edbc 587 /** \brief Tests alignment of the number \a val with the \a n boundary.
AnnaBridge 171:3a7713b1edbc 588 *
AnnaBridge 171:3a7713b1edbc 589 * \param[in] val Input value.
AnnaBridge 171:3a7713b1edbc 590 * \param[in] n Boundary.
AnnaBridge 171:3a7713b1edbc 591 *
AnnaBridge 171:3a7713b1edbc 592 * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0.
AnnaBridge 171:3a7713b1edbc 593 */
AnnaBridge 171:3a7713b1edbc 594 #define Test_align(val, n) (!Tst_bits( val, (n) - 1 ) )
AnnaBridge 171:3a7713b1edbc 595
AnnaBridge 171:3a7713b1edbc 596 /** \brief Gets alignment of the number \a val with respect to the \a n boundary.
AnnaBridge 171:3a7713b1edbc 597 *
AnnaBridge 171:3a7713b1edbc 598 * \param[in] val Input value.
AnnaBridge 171:3a7713b1edbc 599 * \param[in] n Boundary.
AnnaBridge 171:3a7713b1edbc 600 *
AnnaBridge 171:3a7713b1edbc 601 * \return Alignment of the number \a val with respect to the \a n boundary.
AnnaBridge 171:3a7713b1edbc 602 */
AnnaBridge 171:3a7713b1edbc 603 #define Get_align(val, n) ( Rd_bits( val, (n) - 1 ) )
AnnaBridge 171:3a7713b1edbc 604
AnnaBridge 171:3a7713b1edbc 605 /** \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary.
AnnaBridge 171:3a7713b1edbc 606 *
AnnaBridge 171:3a7713b1edbc 607 * \param[in] lval Input/output lvalue.
AnnaBridge 171:3a7713b1edbc 608 * \param[in] n Boundary.
AnnaBridge 171:3a7713b1edbc 609 * \param[in] alg Alignment.
AnnaBridge 171:3a7713b1edbc 610 *
AnnaBridge 171:3a7713b1edbc 611 * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary.
AnnaBridge 171:3a7713b1edbc 612 */
AnnaBridge 171:3a7713b1edbc 613 #define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) )
AnnaBridge 171:3a7713b1edbc 614
AnnaBridge 171:3a7713b1edbc 615 /** \brief Aligns the number \a val with the upper \a n boundary.
AnnaBridge 171:3a7713b1edbc 616 *
AnnaBridge 171:3a7713b1edbc 617 * \param[in] val Input value.
AnnaBridge 171:3a7713b1edbc 618 * \param[in] n Boundary.
AnnaBridge 171:3a7713b1edbc 619 *
AnnaBridge 171:3a7713b1edbc 620 * \return Value resulting from the number \a val aligned with the upper \a n boundary.
AnnaBridge 171:3a7713b1edbc 621 */
AnnaBridge 171:3a7713b1edbc 622 #define Align_up( val, n) (((val) + ((n) - 1)) & ~((n) - 1))
AnnaBridge 171:3a7713b1edbc 623
AnnaBridge 171:3a7713b1edbc 624 /** \brief Aligns the number \a val with the lower \a n boundary.
AnnaBridge 171:3a7713b1edbc 625 *
AnnaBridge 171:3a7713b1edbc 626 * \param[in] val Input value.
AnnaBridge 171:3a7713b1edbc 627 * \param[in] n Boundary.
AnnaBridge 171:3a7713b1edbc 628 *
AnnaBridge 171:3a7713b1edbc 629 * \return Value resulting from the number \a val aligned with the lower \a n boundary.
AnnaBridge 171:3a7713b1edbc 630 */
AnnaBridge 171:3a7713b1edbc 631 #define Align_down(val, n) ( (val) & ~((n) - 1))
AnnaBridge 171:3a7713b1edbc 632
AnnaBridge 171:3a7713b1edbc 633 /** @} */
AnnaBridge 171:3a7713b1edbc 634
AnnaBridge 171:3a7713b1edbc 635
AnnaBridge 171:3a7713b1edbc 636 /** \name Mathematics
AnnaBridge 171:3a7713b1edbc 637 *
AnnaBridge 171:3a7713b1edbc 638 * The same considerations as for clz and ctz apply here but GCC does not
AnnaBridge 171:3a7713b1edbc 639 * provide built-in functions to access the assembly instructions abs, min and
AnnaBridge 171:3a7713b1edbc 640 * max and it does not produce them by itself in most cases, so two sets of
AnnaBridge 171:3a7713b1edbc 641 * macros are defined here:
AnnaBridge 171:3a7713b1edbc 642 * - Abs, Min and Max to apply to constant expressions (values known at
AnnaBridge 171:3a7713b1edbc 643 * compile time);
AnnaBridge 171:3a7713b1edbc 644 * - abs, min and max to apply to non-constant expressions (values unknown at
AnnaBridge 171:3a7713b1edbc 645 * compile time), abs is found in stdlib.h.
AnnaBridge 171:3a7713b1edbc 646 *
AnnaBridge 171:3a7713b1edbc 647 * @{ */
AnnaBridge 171:3a7713b1edbc 648
AnnaBridge 171:3a7713b1edbc 649 /** \brief Takes the absolute value of \a a.
AnnaBridge 171:3a7713b1edbc 650 *
AnnaBridge 171:3a7713b1edbc 651 * \param[in] a Input value.
AnnaBridge 171:3a7713b1edbc 652 *
AnnaBridge 171:3a7713b1edbc 653 * \return Absolute value of \a a.
AnnaBridge 171:3a7713b1edbc 654 *
AnnaBridge 171:3a7713b1edbc 655 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 656 */
AnnaBridge 171:3a7713b1edbc 657 #define Abs(a) (((a) < 0 ) ? -(a) : (a))
AnnaBridge 171:3a7713b1edbc 658
AnnaBridge 171:3a7713b1edbc 659 /** \brief Takes the minimal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 660 *
AnnaBridge 171:3a7713b1edbc 661 * \param[in] a Input value.
AnnaBridge 171:3a7713b1edbc 662 * \param[in] b Input value.
AnnaBridge 171:3a7713b1edbc 663 *
AnnaBridge 171:3a7713b1edbc 664 * \return Minimal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 665 *
AnnaBridge 171:3a7713b1edbc 666 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 667 */
AnnaBridge 171:3a7713b1edbc 668 #define Min(a, b) (((a) < (b)) ? (a) : (b))
AnnaBridge 171:3a7713b1edbc 669
AnnaBridge 171:3a7713b1edbc 670 /** \brief Takes the maximal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 671 *
AnnaBridge 171:3a7713b1edbc 672 * \param[in] a Input value.
AnnaBridge 171:3a7713b1edbc 673 * \param[in] b Input value.
AnnaBridge 171:3a7713b1edbc 674 *
AnnaBridge 171:3a7713b1edbc 675 * \return Maximal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 676 *
AnnaBridge 171:3a7713b1edbc 677 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 678 */
AnnaBridge 171:3a7713b1edbc 679 #define Max(a, b) (((a) > (b)) ? (a) : (b))
AnnaBridge 171:3a7713b1edbc 680
AnnaBridge 171:3a7713b1edbc 681 /** \brief Takes the minimal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 682 *
AnnaBridge 171:3a7713b1edbc 683 * \param[in] a Input value.
AnnaBridge 171:3a7713b1edbc 684 * \param[in] b Input value.
AnnaBridge 171:3a7713b1edbc 685 *
AnnaBridge 171:3a7713b1edbc 686 * \return Minimal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 687 *
AnnaBridge 171:3a7713b1edbc 688 * \note More optimized if only used with values unknown at compile time.
AnnaBridge 171:3a7713b1edbc 689 */
AnnaBridge 171:3a7713b1edbc 690 #define min(a, b) Min(a, b)
AnnaBridge 171:3a7713b1edbc 691
AnnaBridge 171:3a7713b1edbc 692 /** \brief Takes the maximal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 693 *
AnnaBridge 171:3a7713b1edbc 694 * \param[in] a Input value.
AnnaBridge 171:3a7713b1edbc 695 * \param[in] b Input value.
AnnaBridge 171:3a7713b1edbc 696 *
AnnaBridge 171:3a7713b1edbc 697 * \return Maximal value of \a a and \a b.
AnnaBridge 171:3a7713b1edbc 698 *
AnnaBridge 171:3a7713b1edbc 699 * \note More optimized if only used with values unknown at compile time.
AnnaBridge 171:3a7713b1edbc 700 */
AnnaBridge 171:3a7713b1edbc 701 #define max(a, b) Max(a, b)
AnnaBridge 171:3a7713b1edbc 702
AnnaBridge 171:3a7713b1edbc 703 /** @} */
AnnaBridge 171:3a7713b1edbc 704
AnnaBridge 171:3a7713b1edbc 705
AnnaBridge 171:3a7713b1edbc 706 /** \brief Calls the routine at address \a addr.
AnnaBridge 171:3a7713b1edbc 707 *
AnnaBridge 171:3a7713b1edbc 708 * It generates a long call opcode.
AnnaBridge 171:3a7713b1edbc 709 *
AnnaBridge 171:3a7713b1edbc 710 * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if
AnnaBridge 171:3a7713b1edbc 711 * it is invoked from the CPU supervisor mode.
AnnaBridge 171:3a7713b1edbc 712 *
AnnaBridge 171:3a7713b1edbc 713 * \param[in] addr Address of the routine to call.
AnnaBridge 171:3a7713b1edbc 714 *
AnnaBridge 171:3a7713b1edbc 715 * \note It may be used as a long jump opcode in some special cases.
AnnaBridge 171:3a7713b1edbc 716 */
AnnaBridge 171:3a7713b1edbc 717 #define Long_call(addr) ((*(void (*)(void))(addr))())
AnnaBridge 171:3a7713b1edbc 718
AnnaBridge 171:3a7713b1edbc 719
AnnaBridge 171:3a7713b1edbc 720 /** \name MCU Endianism Handling
AnnaBridge 171:3a7713b1edbc 721 * ARM is MCU little endian.
AnnaBridge 171:3a7713b1edbc 722 *
AnnaBridge 171:3a7713b1edbc 723 * @{ */
AnnaBridge 171:3a7713b1edbc 724 #define BE16(x) Swap16(x)
AnnaBridge 171:3a7713b1edbc 725 #define LE16(x) (x)
AnnaBridge 171:3a7713b1edbc 726
AnnaBridge 171:3a7713b1edbc 727 #define le16_to_cpu(x) (x)
AnnaBridge 171:3a7713b1edbc 728 #define cpu_to_le16(x) (x)
AnnaBridge 171:3a7713b1edbc 729 #define LE16_TO_CPU(x) (x)
AnnaBridge 171:3a7713b1edbc 730 #define CPU_TO_LE16(x) (x)
AnnaBridge 171:3a7713b1edbc 731
AnnaBridge 171:3a7713b1edbc 732 #define be16_to_cpu(x) Swap16(x)
AnnaBridge 171:3a7713b1edbc 733 #define cpu_to_be16(x) Swap16(x)
AnnaBridge 171:3a7713b1edbc 734 #define BE16_TO_CPU(x) Swap16(x)
AnnaBridge 171:3a7713b1edbc 735 #define CPU_TO_BE16(x) Swap16(x)
AnnaBridge 171:3a7713b1edbc 736
AnnaBridge 171:3a7713b1edbc 737 #define le32_to_cpu(x) (x)
AnnaBridge 171:3a7713b1edbc 738 #define cpu_to_le32(x) (x)
AnnaBridge 171:3a7713b1edbc 739 #define LE32_TO_CPU(x) (x)
AnnaBridge 171:3a7713b1edbc 740 #define CPU_TO_LE32(x) (x)
AnnaBridge 171:3a7713b1edbc 741
AnnaBridge 171:3a7713b1edbc 742 #define be32_to_cpu(x) swap32(x)
AnnaBridge 171:3a7713b1edbc 743 #define cpu_to_be32(x) swap32(x)
AnnaBridge 171:3a7713b1edbc 744 #define BE32_TO_CPU(x) swap32(x)
AnnaBridge 171:3a7713b1edbc 745 #define CPU_TO_BE32(x) swap32(x)
AnnaBridge 171:3a7713b1edbc 746 /** @} */
AnnaBridge 171:3a7713b1edbc 747
AnnaBridge 171:3a7713b1edbc 748
AnnaBridge 171:3a7713b1edbc 749 /** \name Endianism Conversion
AnnaBridge 171:3a7713b1edbc 750 *
AnnaBridge 171:3a7713b1edbc 751 * The same considerations as for clz and ctz apply here but GCC's
AnnaBridge 171:3a7713b1edbc 752 * __builtin_bswap_32 and __builtin_bswap_64 do not behave like macros when
AnnaBridge 171:3a7713b1edbc 753 * applied to constant expressions, so two sets of macros are defined here:
AnnaBridge 171:3a7713b1edbc 754 * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known
AnnaBridge 171:3a7713b1edbc 755 * at compile time);
AnnaBridge 171:3a7713b1edbc 756 * - swap16, swap32 and swap64 to apply to non-constant expressions (values
AnnaBridge 171:3a7713b1edbc 757 * unknown at compile time).
AnnaBridge 171:3a7713b1edbc 758 *
AnnaBridge 171:3a7713b1edbc 759 * @{ */
AnnaBridge 171:3a7713b1edbc 760
AnnaBridge 171:3a7713b1edbc 761 /** \brief Toggles the endianism of \a u16 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 762 *
AnnaBridge 171:3a7713b1edbc 763 * \param[in] u16 U16 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 764 *
AnnaBridge 171:3a7713b1edbc 765 * \return Value resulting from \a u16 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 766 *
AnnaBridge 171:3a7713b1edbc 767 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 768 */
AnnaBridge 171:3a7713b1edbc 769 #define Swap16(u16) ((uint16_t)(((uint16_t)(u16) >> 8) |\
AnnaBridge 171:3a7713b1edbc 770 ((uint16_t)(u16) << 8)))
AnnaBridge 171:3a7713b1edbc 771
AnnaBridge 171:3a7713b1edbc 772 /** \brief Toggles the endianism of \a u32 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 773 *
AnnaBridge 171:3a7713b1edbc 774 * \param[in] u32 U32 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 775 *
AnnaBridge 171:3a7713b1edbc 776 * \return Value resulting from \a u32 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 777 *
AnnaBridge 171:3a7713b1edbc 778 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 779 */
AnnaBridge 171:3a7713b1edbc 780 #define Swap32(u32) ((uint32_t)(((uint32_t)Swap16((uint32_t)(u32) >> 16)) |\
AnnaBridge 171:3a7713b1edbc 781 ((uint32_t)Swap16((uint32_t)(u32)) << 16)))
AnnaBridge 171:3a7713b1edbc 782
AnnaBridge 171:3a7713b1edbc 783 /** \brief Toggles the endianism of \a u64 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 784 *
AnnaBridge 171:3a7713b1edbc 785 * \param[in] u64 U64 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 786 *
AnnaBridge 171:3a7713b1edbc 787 * \return Value resulting from \a u64 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 788 *
AnnaBridge 171:3a7713b1edbc 789 * \note More optimized if only used with values known at compile time.
AnnaBridge 171:3a7713b1edbc 790 */
AnnaBridge 171:3a7713b1edbc 791 #define Swap64(u64) ((uint64_t)(((uint64_t)Swap32((uint64_t)(u64) >> 32)) |\
AnnaBridge 171:3a7713b1edbc 792 ((uint64_t)Swap32((uint64_t)(u64)) << 32)))
AnnaBridge 171:3a7713b1edbc 793
AnnaBridge 171:3a7713b1edbc 794 /** \brief Toggles the endianism of \a u16 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 795 *
AnnaBridge 171:3a7713b1edbc 796 * \param[in] u16 U16 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 797 *
AnnaBridge 171:3a7713b1edbc 798 * \return Value resulting from \a u16 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 799 *
AnnaBridge 171:3a7713b1edbc 800 * \note More optimized if only used with values unknown at compile time.
AnnaBridge 171:3a7713b1edbc 801 */
AnnaBridge 171:3a7713b1edbc 802 #define swap16(u16) Swap16(u16)
AnnaBridge 171:3a7713b1edbc 803
AnnaBridge 171:3a7713b1edbc 804 /** \brief Toggles the endianism of \a u32 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 805 *
AnnaBridge 171:3a7713b1edbc 806 * \param[in] u32 U32 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 807 *
AnnaBridge 171:3a7713b1edbc 808 * \return Value resulting from \a u32 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 809 *
AnnaBridge 171:3a7713b1edbc 810 * \note More optimized if only used with values unknown at compile time.
AnnaBridge 171:3a7713b1edbc 811 */
AnnaBridge 171:3a7713b1edbc 812 #if (defined __GNUC__)
AnnaBridge 171:3a7713b1edbc 813 # define swap32(u32) ((uint32_t)__builtin_bswap32((uint32_t)(u32)))
AnnaBridge 171:3a7713b1edbc 814 #else
AnnaBridge 171:3a7713b1edbc 815 # define swap32(u32) Swap32(u32)
AnnaBridge 171:3a7713b1edbc 816 #endif
AnnaBridge 171:3a7713b1edbc 817
AnnaBridge 171:3a7713b1edbc 818 /** \brief Toggles the endianism of \a u64 (by swapping its bytes).
AnnaBridge 171:3a7713b1edbc 819 *
AnnaBridge 171:3a7713b1edbc 820 * \param[in] u64 U64 of which to toggle the endianism.
AnnaBridge 171:3a7713b1edbc 821 *
AnnaBridge 171:3a7713b1edbc 822 * \return Value resulting from \a u64 with toggled endianism.
AnnaBridge 171:3a7713b1edbc 823 *
AnnaBridge 171:3a7713b1edbc 824 * \note More optimized if only used with values unknown at compile time.
AnnaBridge 171:3a7713b1edbc 825 */
AnnaBridge 171:3a7713b1edbc 826 #if (defined __GNUC__)
AnnaBridge 171:3a7713b1edbc 827 # define swap64(u64) ((uint64_t)__builtin_bswap64((uint64_t)(u64)))
AnnaBridge 171:3a7713b1edbc 828 #else
AnnaBridge 171:3a7713b1edbc 829 # define swap64(u64) ((uint64_t)(((uint64_t)swap32((uint64_t)(u64) >> 32)) |\
AnnaBridge 171:3a7713b1edbc 830 ((uint64_t)swap32((uint64_t)(u64)) << 32)))
AnnaBridge 171:3a7713b1edbc 831 #endif
AnnaBridge 171:3a7713b1edbc 832
AnnaBridge 171:3a7713b1edbc 833 /** @} */
AnnaBridge 171:3a7713b1edbc 834
AnnaBridge 171:3a7713b1edbc 835
AnnaBridge 171:3a7713b1edbc 836 /** \name Target Abstraction
AnnaBridge 171:3a7713b1edbc 837 *
AnnaBridge 171:3a7713b1edbc 838 * @{ */
AnnaBridge 171:3a7713b1edbc 839
AnnaBridge 171:3a7713b1edbc 840 #define _GLOBEXT_ extern /**< extern storage-class specifier. */
AnnaBridge 171:3a7713b1edbc 841 #define _CONST_TYPE_ const /**< const type qualifier. */
AnnaBridge 171:3a7713b1edbc 842 #define _MEM_TYPE_SLOW_ /**< Slow memory type. */
AnnaBridge 171:3a7713b1edbc 843 #define _MEM_TYPE_MEDFAST_ /**< Fairly fast memory type. */
AnnaBridge 171:3a7713b1edbc 844 #define _MEM_TYPE_FAST_ /**< Fast memory type. */
AnnaBridge 171:3a7713b1edbc 845
AnnaBridge 171:3a7713b1edbc 846 #define memcmp_ram2ram memcmp /**< Target-specific memcmp of RAM to RAM. */
AnnaBridge 171:3a7713b1edbc 847 #define memcmp_code2ram memcmp /**< Target-specific memcmp of RAM to NVRAM. */
AnnaBridge 171:3a7713b1edbc 848 #define memcpy_ram2ram memcpy /**< Target-specific memcpy from RAM to RAM. */
AnnaBridge 171:3a7713b1edbc 849 #define memcpy_code2ram memcpy /**< Target-specific memcpy from NVRAM to RAM. */
AnnaBridge 171:3a7713b1edbc 850
AnnaBridge 171:3a7713b1edbc 851 /** @} */
AnnaBridge 171:3a7713b1edbc 852
AnnaBridge 171:3a7713b1edbc 853 /**
AnnaBridge 171:3a7713b1edbc 854 * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using
AnnaBridge 171:3a7713b1edbc 855 * integer arithmetic.
AnnaBridge 171:3a7713b1edbc 856 *
AnnaBridge 171:3a7713b1edbc 857 * \param[in] a An integer
AnnaBridge 171:3a7713b1edbc 858 * \param[in] b Another integer
AnnaBridge 171:3a7713b1edbc 859 *
AnnaBridge 171:3a7713b1edbc 860 * \return (\a a / \a b) rounded up to the nearest integer.
AnnaBridge 171:3a7713b1edbc 861 */
AnnaBridge 171:3a7713b1edbc 862 #define div_ceil(a, b) (((a) + (b) - 1) / (b))
AnnaBridge 171:3a7713b1edbc 863
AnnaBridge 171:3a7713b1edbc 864 #endif /* #ifndef __ASSEMBLY__ */
AnnaBridge 171:3a7713b1edbc 865 #ifdef __ICCARM__
AnnaBridge 171:3a7713b1edbc 866 /** \name Compiler Keywords
AnnaBridge 171:3a7713b1edbc 867 *
AnnaBridge 171:3a7713b1edbc 868 * Port of some keywords from GCC to IAR Embedded Workbench.
AnnaBridge 171:3a7713b1edbc 869 *
AnnaBridge 171:3a7713b1edbc 870 * @{ */
AnnaBridge 171:3a7713b1edbc 871
AnnaBridge 171:3a7713b1edbc 872 #define __asm__ asm
AnnaBridge 171:3a7713b1edbc 873 #define __inline__ inline
AnnaBridge 171:3a7713b1edbc 874 #define __volatile__
AnnaBridge 171:3a7713b1edbc 875
AnnaBridge 171:3a7713b1edbc 876 /** @} */
AnnaBridge 171:3a7713b1edbc 877
AnnaBridge 171:3a7713b1edbc 878 #endif
AnnaBridge 171:3a7713b1edbc 879
AnnaBridge 171:3a7713b1edbc 880 #define FUNC_PTR void *
AnnaBridge 171:3a7713b1edbc 881 /**
AnnaBridge 171:3a7713b1edbc 882 * \def unused
AnnaBridge 171:3a7713b1edbc 883 * \brief Marking \a v as a unused parameter or value.
AnnaBridge 171:3a7713b1edbc 884 */
AnnaBridge 171:3a7713b1edbc 885 #define unused(v) do { (void)(v); } while(0)
AnnaBridge 171:3a7713b1edbc 886
AnnaBridge 171:3a7713b1edbc 887 /* Define RAMFUNC attribute */
AnnaBridge 171:3a7713b1edbc 888 #if defined ( __CC_ARM ) /* Keil uVision 4 */
AnnaBridge 171:3a7713b1edbc 889 # define RAMFUNC __attribute__ ((section(".ramfunc")))
AnnaBridge 171:3a7713b1edbc 890 #elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
AnnaBridge 171:3a7713b1edbc 891 # define RAMFUNC __ramfunc
AnnaBridge 171:3a7713b1edbc 892 #elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
AnnaBridge 171:3a7713b1edbc 893 # define RAMFUNC __attribute__ ((section(".ramfunc")))
AnnaBridge 171:3a7713b1edbc 894 #endif
AnnaBridge 171:3a7713b1edbc 895
AnnaBridge 171:3a7713b1edbc 896 /* Define OPTIMIZE_HIGH attribute */
AnnaBridge 171:3a7713b1edbc 897 #if defined ( __CC_ARM ) /* Keil uVision 4 */
AnnaBridge 171:3a7713b1edbc 898 # define OPTIMIZE_HIGH _Pragma("O3")
AnnaBridge 171:3a7713b1edbc 899 #elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
AnnaBridge 171:3a7713b1edbc 900 # define OPTIMIZE_HIGH _Pragma("optimize=high")
AnnaBridge 171:3a7713b1edbc 901 #elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
AnnaBridge 171:3a7713b1edbc 902 # define OPTIMIZE_HIGH __attribute__((optimize(s)))
AnnaBridge 171:3a7713b1edbc 903 #endif
AnnaBridge 171:3a7713b1edbc 904 #define PASS 0
AnnaBridge 171:3a7713b1edbc 905 #define FAIL 1
AnnaBridge 171:3a7713b1edbc 906 #define LOW 0
AnnaBridge 171:3a7713b1edbc 907 #define HIGH 1
AnnaBridge 171:3a7713b1edbc 908
AnnaBridge 171:3a7713b1edbc 909 typedef int8_t S8 ; //!< 8-bit signed integer.
AnnaBridge 171:3a7713b1edbc 910 typedef uint8_t U8 ; //!< 8-bit unsigned integer.
AnnaBridge 171:3a7713b1edbc 911 typedef int16_t S16; //!< 16-bit signed integer.
AnnaBridge 171:3a7713b1edbc 912 typedef uint16_t U16; //!< 16-bit unsigned integer.
AnnaBridge 171:3a7713b1edbc 913 typedef int32_t S32; //!< 32-bit signed integer.
AnnaBridge 171:3a7713b1edbc 914 typedef uint32_t U32; //!< 32-bit unsigned integer.
AnnaBridge 171:3a7713b1edbc 915 typedef int64_t S64; //!< 64-bit signed integer.
AnnaBridge 171:3a7713b1edbc 916 typedef uint64_t U64; //!< 64-bit unsigned integer.
AnnaBridge 171:3a7713b1edbc 917 typedef float F32; //!< 32-bit floating-point number.
AnnaBridge 171:3a7713b1edbc 918 typedef double F64; //!< 64-bit floating-point number.
AnnaBridge 171:3a7713b1edbc 919
AnnaBridge 171:3a7713b1edbc 920 #define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16.
AnnaBridge 171:3a7713b1edbc 921 #define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16.
AnnaBridge 171:3a7713b1edbc 922
AnnaBridge 171:3a7713b1edbc 923 #define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32.
AnnaBridge 171:3a7713b1edbc 924 #define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32.
AnnaBridge 171:3a7713b1edbc 925 #define MSB0W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32.
AnnaBridge 171:3a7713b1edbc 926 #define MSB1W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 927 #define MSB2W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 928 #define MSB3W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32.
AnnaBridge 171:3a7713b1edbc 929 #define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32.
AnnaBridge 171:3a7713b1edbc 930 #define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 931 #define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 932 #define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32.
AnnaBridge 171:3a7713b1edbc 933
AnnaBridge 171:3a7713b1edbc 934 #define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64.
AnnaBridge 171:3a7713b1edbc 935 #define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64.
AnnaBridge 171:3a7713b1edbc 936 #define MSH0(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 1st rank of \a u64.
AnnaBridge 171:3a7713b1edbc 937 #define MSH1(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 2nd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 938 #define MSH2(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 3rd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 939 #define MSH3(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 4th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 940 #define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 941 #define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 942 #define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 943 #define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64.
AnnaBridge 171:3a7713b1edbc 944 #define MSB0D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 1st rank of \a u64.
AnnaBridge 171:3a7713b1edbc 945 #define MSB1D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 2nd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 946 #define MSB2D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 3rd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 947 #define MSB3D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 4th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 948 #define MSB4D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 5th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 949 #define MSB5D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 6th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 950 #define MSB6D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 7th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 951 #define MSB7D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 8th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 952 #define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 953 #define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 954 #define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 955 #define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 956 #define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64.
AnnaBridge 171:3a7713b1edbc 957 #define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 958 #define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64.
AnnaBridge 171:3a7713b1edbc 959 #define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64.
AnnaBridge 171:3a7713b1edbc 960
AnnaBridge 171:3a7713b1edbc 961 #define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32.
AnnaBridge 171:3a7713b1edbc 962 #define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 963 #define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 964 #define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32.
AnnaBridge 171:3a7713b1edbc 965 #define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32.
AnnaBridge 171:3a7713b1edbc 966 #define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 967 #define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32.
AnnaBridge 171:3a7713b1edbc 968 #define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32.
AnnaBridge 171:3a7713b1edbc 969
AnnaBridge 171:3a7713b1edbc 970 #if defined(__ICCARM__)
AnnaBridge 171:3a7713b1edbc 971 #define SHORTENUM __packed
AnnaBridge 171:3a7713b1edbc 972 #elif defined(__GNUC__)
AnnaBridge 171:3a7713b1edbc 973 #define SHORTENUM __attribute__((packed))
AnnaBridge 171:3a7713b1edbc 974 #endif
AnnaBridge 171:3a7713b1edbc 975
AnnaBridge 171:3a7713b1edbc 976 /* No operation */
AnnaBridge 171:3a7713b1edbc 977 #if defined(__ICCARM__)
AnnaBridge 171:3a7713b1edbc 978 #define nop() __no_operation()
AnnaBridge 171:3a7713b1edbc 979 #elif defined(__GNUC__)
AnnaBridge 171:3a7713b1edbc 980 #define nop() (__NOP())
AnnaBridge 171:3a7713b1edbc 981 #endif
AnnaBridge 171:3a7713b1edbc 982
AnnaBridge 171:3a7713b1edbc 983 #define FLASH_DECLARE(x) const x
AnnaBridge 171:3a7713b1edbc 984 #define FLASH_EXTERN(x) extern const x
AnnaBridge 171:3a7713b1edbc 985 #define PGM_READ_BYTE(x) *(x)
AnnaBridge 171:3a7713b1edbc 986 #define PGM_READ_WORD(x) *(x)
AnnaBridge 171:3a7713b1edbc 987 #define MEMCPY_ENDIAN memcpy
AnnaBridge 171:3a7713b1edbc 988 #define PGM_READ_BLOCK(dst, src, len) memcpy((dst), (src), (len))
AnnaBridge 171:3a7713b1edbc 989
AnnaBridge 171:3a7713b1edbc 990 /*Defines the Flash Storage for the request and response of MAC*/
AnnaBridge 171:3a7713b1edbc 991 #define CMD_ID_OCTET (0)
AnnaBridge 171:3a7713b1edbc 992
AnnaBridge 171:3a7713b1edbc 993 /* Converting of values from CPU endian to little endian. */
AnnaBridge 171:3a7713b1edbc 994 #define CPU_ENDIAN_TO_LE16(x) (x)
AnnaBridge 171:3a7713b1edbc 995 #define CPU_ENDIAN_TO_LE32(x) (x)
AnnaBridge 171:3a7713b1edbc 996 #define CPU_ENDIAN_TO_LE64(x) (x)
AnnaBridge 171:3a7713b1edbc 997
AnnaBridge 171:3a7713b1edbc 998 /* Converting of values from little endian to CPU endian. */
AnnaBridge 171:3a7713b1edbc 999 #define LE16_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1000 #define LE32_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1001 #define LE64_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1002
AnnaBridge 171:3a7713b1edbc 1003 /* Converting of constants from little endian to CPU endian. */
AnnaBridge 171:3a7713b1edbc 1004 #define CLE16_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1005 #define CLE32_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1006 #define CLE64_TO_CPU_ENDIAN(x) (x)
AnnaBridge 171:3a7713b1edbc 1007
AnnaBridge 171:3a7713b1edbc 1008 /* Converting of constants from CPU endian to little endian. */
AnnaBridge 171:3a7713b1edbc 1009 #define CCPU_ENDIAN_TO_LE16(x) (x)
AnnaBridge 171:3a7713b1edbc 1010 #define CCPU_ENDIAN_TO_LE32(x) (x)
AnnaBridge 171:3a7713b1edbc 1011 #define CCPU_ENDIAN_TO_LE64(x) (x)
AnnaBridge 171:3a7713b1edbc 1012
AnnaBridge 171:3a7713b1edbc 1013 #define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src))
AnnaBridge 171:3a7713b1edbc 1014 #define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src))
AnnaBridge 171:3a7713b1edbc 1015
AnnaBridge 171:3a7713b1edbc 1016 /**
AnnaBridge 171:3a7713b1edbc 1017 * @brief Converts a 64-Bit value into a 8 Byte array
AnnaBridge 171:3a7713b1edbc 1018 *
AnnaBridge 171:3a7713b1edbc 1019 * @param[in] value 64-Bit value
AnnaBridge 171:3a7713b1edbc 1020 * @param[out] data Pointer to the 8 Byte array to be updated with 64-Bit value
AnnaBridge 171:3a7713b1edbc 1021 * @ingroup apiPalApi
AnnaBridge 171:3a7713b1edbc 1022 */
AnnaBridge 171:3a7713b1edbc 1023 static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1024 {
AnnaBridge 171:3a7713b1edbc 1025 uint8_t index = 0;
AnnaBridge 171:3a7713b1edbc 1026
AnnaBridge 171:3a7713b1edbc 1027 while (index < 8) {
AnnaBridge 171:3a7713b1edbc 1028 data[index++] = value & 0xFF;
AnnaBridge 171:3a7713b1edbc 1029 value = value >> 8;
AnnaBridge 171:3a7713b1edbc 1030 }
AnnaBridge 171:3a7713b1edbc 1031 }
AnnaBridge 171:3a7713b1edbc 1032
AnnaBridge 171:3a7713b1edbc 1033 /**
AnnaBridge 171:3a7713b1edbc 1034 * @brief Converts a 16-Bit value into a 2 Byte array
AnnaBridge 171:3a7713b1edbc 1035 *
AnnaBridge 171:3a7713b1edbc 1036 * @param[in] value 16-Bit value
AnnaBridge 171:3a7713b1edbc 1037 * @param[out] data Pointer to the 2 Byte array to be updated with 16-Bit value
AnnaBridge 171:3a7713b1edbc 1038 * @ingroup apiPalApi
AnnaBridge 171:3a7713b1edbc 1039 */
AnnaBridge 171:3a7713b1edbc 1040 static inline void convert_16_bit_to_byte_array(uint16_t value, uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1041 {
AnnaBridge 171:3a7713b1edbc 1042 data[0] = value & 0xFF;
AnnaBridge 171:3a7713b1edbc 1043 data[1] = (value >> 8) & 0xFF;
AnnaBridge 171:3a7713b1edbc 1044 }
AnnaBridge 171:3a7713b1edbc 1045
AnnaBridge 171:3a7713b1edbc 1046 /* Converts a 16-Bit value into a 2 Byte array */
AnnaBridge 171:3a7713b1edbc 1047 static inline void convert_spec_16_bit_to_byte_array(uint16_t value, uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1048 {
AnnaBridge 171:3a7713b1edbc 1049 data[0] = value & 0xFF;
AnnaBridge 171:3a7713b1edbc 1050 data[1] = (value >> 8) & 0xFF;
AnnaBridge 171:3a7713b1edbc 1051 }
AnnaBridge 171:3a7713b1edbc 1052
AnnaBridge 171:3a7713b1edbc 1053 /* Converts a 16-Bit value into a 2 Byte array */
AnnaBridge 171:3a7713b1edbc 1054 static inline void convert_16_bit_to_byte_address(uint16_t value, uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1055 {
AnnaBridge 171:3a7713b1edbc 1056 data[0] = value & 0xFF;
AnnaBridge 171:3a7713b1edbc 1057 data[1] = (value >> 8) & 0xFF;
AnnaBridge 171:3a7713b1edbc 1058 }
AnnaBridge 171:3a7713b1edbc 1059
AnnaBridge 171:3a7713b1edbc 1060 /*
AnnaBridge 171:3a7713b1edbc 1061 * @brief Converts a 2 Byte array into a 16-Bit value
AnnaBridge 171:3a7713b1edbc 1062 *
AnnaBridge 171:3a7713b1edbc 1063 * @param data Specifies the pointer to the 2 Byte array
AnnaBridge 171:3a7713b1edbc 1064 *
AnnaBridge 171:3a7713b1edbc 1065 * @return 16-Bit value
AnnaBridge 171:3a7713b1edbc 1066 * @ingroup apiPalApi
AnnaBridge 171:3a7713b1edbc 1067 */
AnnaBridge 171:3a7713b1edbc 1068 static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1069 {
AnnaBridge 171:3a7713b1edbc 1070 return (data[0] | ((uint16_t)data[1] << 8));
AnnaBridge 171:3a7713b1edbc 1071 }
AnnaBridge 171:3a7713b1edbc 1072
AnnaBridge 171:3a7713b1edbc 1073 /* Converts a 4 Byte array into a 32-Bit value */
AnnaBridge 171:3a7713b1edbc 1074 static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1075 {
AnnaBridge 171:3a7713b1edbc 1076 union {
AnnaBridge 171:3a7713b1edbc 1077 uint32_t u32;
AnnaBridge 171:3a7713b1edbc 1078 uint8_t u8[4];
AnnaBridge 171:3a7713b1edbc 1079 } long_addr;
AnnaBridge 171:3a7713b1edbc 1080 uint8_t index;
AnnaBridge 171:3a7713b1edbc 1081 for (index = 0; index < 4; index++) {
AnnaBridge 171:3a7713b1edbc 1082 long_addr.u8[index] = *data++;
AnnaBridge 171:3a7713b1edbc 1083 }
AnnaBridge 171:3a7713b1edbc 1084 return long_addr.u32;
AnnaBridge 171:3a7713b1edbc 1085 }
AnnaBridge 171:3a7713b1edbc 1086
AnnaBridge 171:3a7713b1edbc 1087 /**
AnnaBridge 171:3a7713b1edbc 1088 * @brief Converts a 8 Byte array into a 64-Bit value
AnnaBridge 171:3a7713b1edbc 1089 *
AnnaBridge 171:3a7713b1edbc 1090 * @param data Specifies the pointer to the 8 Byte array
AnnaBridge 171:3a7713b1edbc 1091 *
AnnaBridge 171:3a7713b1edbc 1092 * @return 64-Bit value
AnnaBridge 171:3a7713b1edbc 1093 * @ingroup apiPalApi
AnnaBridge 171:3a7713b1edbc 1094 */
AnnaBridge 171:3a7713b1edbc 1095 static inline uint64_t convert_byte_array_to_64_bit(uint8_t *data)
AnnaBridge 171:3a7713b1edbc 1096 {
AnnaBridge 171:3a7713b1edbc 1097 union {
AnnaBridge 171:3a7713b1edbc 1098 uint64_t u64;
AnnaBridge 171:3a7713b1edbc 1099 uint8_t u8[8];
AnnaBridge 171:3a7713b1edbc 1100 } long_addr;
AnnaBridge 171:3a7713b1edbc 1101
AnnaBridge 171:3a7713b1edbc 1102 uint8_t index;
AnnaBridge 171:3a7713b1edbc 1103
AnnaBridge 171:3a7713b1edbc 1104 for (index = 0; index < 8; index++) {
AnnaBridge 171:3a7713b1edbc 1105 long_addr.u8[index] = *data++;
AnnaBridge 171:3a7713b1edbc 1106 }
AnnaBridge 171:3a7713b1edbc 1107
AnnaBridge 171:3a7713b1edbc 1108 return long_addr.u64;
AnnaBridge 171:3a7713b1edbc 1109 }
AnnaBridge 171:3a7713b1edbc 1110
AnnaBridge 171:3a7713b1edbc 1111 /** @} */
AnnaBridge 171:3a7713b1edbc 1112
AnnaBridge 171:3a7713b1edbc 1113 #endif /* UTILS_COMPILER_H_INCLUDED */