TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmot 1:d0dfbce63a89 1
elmot 1:d0dfbce63a89 2 /** \addtogroup platform */
elmot 1:d0dfbce63a89 3 /** @{*/
elmot 1:d0dfbce63a89 4 /* mbed Microcontroller Library
elmot 1:d0dfbce63a89 5 * Copyright (c) 2006-2013 ARM Limited
elmot 1:d0dfbce63a89 6 *
elmot 1:d0dfbce63a89 7 * Licensed under the Apache License, Version 2.0 (the "License");
elmot 1:d0dfbce63a89 8 * you may not use this file except in compliance with the License.
elmot 1:d0dfbce63a89 9 * You may obtain a copy of the License at
elmot 1:d0dfbce63a89 10 *
elmot 1:d0dfbce63a89 11 * http://www.apache.org/licenses/LICENSE-2.0
elmot 1:d0dfbce63a89 12 *
elmot 1:d0dfbce63a89 13 * Unless required by applicable law or agreed to in writing, software
elmot 1:d0dfbce63a89 14 * distributed under the License is distributed on an "AS IS" BASIS,
elmot 1:d0dfbce63a89 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
elmot 1:d0dfbce63a89 16 * See the License for the specific language governing permissions and
elmot 1:d0dfbce63a89 17 * limitations under the License.
elmot 1:d0dfbce63a89 18 */
elmot 1:d0dfbce63a89 19 #ifndef MBED_TOOLCHAIN_H
elmot 1:d0dfbce63a89 20 #define MBED_TOOLCHAIN_H
elmot 1:d0dfbce63a89 21
elmot 1:d0dfbce63a89 22 #include "mbed_preprocessor.h"
elmot 1:d0dfbce63a89 23
elmot 1:d0dfbce63a89 24
elmot 1:d0dfbce63a89 25 // Warning for unsupported compilers
elmot 1:d0dfbce63a89 26 #if !defined(__GNUC__) /* GCC */ \
elmot 1:d0dfbce63a89 27 && !defined(__CC_ARM) /* ARMCC */ \
elmot 1:d0dfbce63a89 28 && !defined(__clang__) /* LLVM/Clang */ \
elmot 1:d0dfbce63a89 29 && !defined(__ICCARM__) /* IAR */
elmot 1:d0dfbce63a89 30 #warning "This compiler is not yet supported."
elmot 1:d0dfbce63a89 31 #endif
elmot 1:d0dfbce63a89 32
elmot 1:d0dfbce63a89 33
elmot 1:d0dfbce63a89 34 // Attributes
elmot 1:d0dfbce63a89 35
elmot 1:d0dfbce63a89 36 /** MBED_PACKED
elmot 1:d0dfbce63a89 37 * Pack a structure, preventing any padding from being added between fields.
elmot 1:d0dfbce63a89 38 *
elmot 1:d0dfbce63a89 39 * @code
elmot 1:d0dfbce63a89 40 * #include "toolchain.h"
elmot 1:d0dfbce63a89 41 *
elmot 1:d0dfbce63a89 42 * MBED_PACKED(struct) foo {
elmot 1:d0dfbce63a89 43 * char x;
elmot 1:d0dfbce63a89 44 * int y;
elmot 1:d0dfbce63a89 45 * };
elmot 1:d0dfbce63a89 46 * @endcode
elmot 1:d0dfbce63a89 47 */
elmot 1:d0dfbce63a89 48 #ifndef MBED_PACKED
elmot 1:d0dfbce63a89 49 #if defined(__ICCARM__)
elmot 1:d0dfbce63a89 50 #define MBED_PACKED(struct) __packed struct
elmot 1:d0dfbce63a89 51 #else
elmot 1:d0dfbce63a89 52 #define MBED_PACKED(struct) struct __attribute__((packed))
elmot 1:d0dfbce63a89 53 #endif
elmot 1:d0dfbce63a89 54 #endif
elmot 1:d0dfbce63a89 55
elmot 1:d0dfbce63a89 56 /** MBED_ALIGN(N)
elmot 1:d0dfbce63a89 57 * Declare a variable to be aligned on an N-byte boundary.
elmot 1:d0dfbce63a89 58 *
elmot 1:d0dfbce63a89 59 * @note
elmot 1:d0dfbce63a89 60 * IAR does not support alignment greater than word size on the stack
elmot 1:d0dfbce63a89 61 *
elmot 1:d0dfbce63a89 62 * @code
elmot 1:d0dfbce63a89 63 * #include "toolchain.h"
elmot 1:d0dfbce63a89 64 *
elmot 1:d0dfbce63a89 65 * MBED_ALIGN(16) char a;
elmot 1:d0dfbce63a89 66 * @endcode
elmot 1:d0dfbce63a89 67 */
elmot 1:d0dfbce63a89 68 #ifndef MBED_ALIGN
elmot 1:d0dfbce63a89 69 #if defined(__ICCARM__)
elmot 1:d0dfbce63a89 70 #define MBED_ALIGN(N) _Pragma(MBED_STRINGIFY(data_alignment=N))
elmot 1:d0dfbce63a89 71 #else
elmot 1:d0dfbce63a89 72 #define MBED_ALIGN(N) __attribute__((aligned(N)))
elmot 1:d0dfbce63a89 73 #endif
elmot 1:d0dfbce63a89 74 #endif
elmot 1:d0dfbce63a89 75
elmot 1:d0dfbce63a89 76 /** MBED_UNUSED
elmot 1:d0dfbce63a89 77 * Declare a function argument to be unused, suppressing compiler warnings
elmot 1:d0dfbce63a89 78 *
elmot 1:d0dfbce63a89 79 * @code
elmot 1:d0dfbce63a89 80 * #include "toolchain.h"
elmot 1:d0dfbce63a89 81 *
elmot 1:d0dfbce63a89 82 * void foo(MBED_UNUSED int arg) {
elmot 1:d0dfbce63a89 83 *
elmot 1:d0dfbce63a89 84 * }
elmot 1:d0dfbce63a89 85 * @endcode
elmot 1:d0dfbce63a89 86 */
elmot 1:d0dfbce63a89 87 #ifndef MBED_UNUSED
elmot 1:d0dfbce63a89 88 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM)
elmot 1:d0dfbce63a89 89 #define MBED_UNUSED __attribute__((__unused__))
elmot 1:d0dfbce63a89 90 #else
elmot 1:d0dfbce63a89 91 #define MBED_UNUSED
elmot 1:d0dfbce63a89 92 #endif
elmot 1:d0dfbce63a89 93 #endif
elmot 1:d0dfbce63a89 94
elmot 1:d0dfbce63a89 95 /** MBED_WEAK
elmot 1:d0dfbce63a89 96 * Mark a function as being weak.
elmot 1:d0dfbce63a89 97 *
elmot 1:d0dfbce63a89 98 * @note
elmot 1:d0dfbce63a89 99 * weak functions are not friendly to making code re-usable, as they can only
elmot 1:d0dfbce63a89 100 * be overridden once (and if they are multiply overridden the linker will emit
elmot 1:d0dfbce63a89 101 * no warning). You should not normally use weak symbols as part of the API to
elmot 1:d0dfbce63a89 102 * re-usable modules.
elmot 1:d0dfbce63a89 103 *
elmot 1:d0dfbce63a89 104 * @code
elmot 1:d0dfbce63a89 105 * #include "toolchain.h"
elmot 1:d0dfbce63a89 106 *
elmot 1:d0dfbce63a89 107 * MBED_WEAK void foo() {
elmot 1:d0dfbce63a89 108 * // a weak implementation of foo that can be overriden by a definition
elmot 1:d0dfbce63a89 109 * // without __weak
elmot 1:d0dfbce63a89 110 * }
elmot 1:d0dfbce63a89 111 * @endcode
elmot 1:d0dfbce63a89 112 */
elmot 1:d0dfbce63a89 113 #ifndef MBED_WEAK
elmot 1:d0dfbce63a89 114 #if defined(__ICCARM__)
elmot 1:d0dfbce63a89 115 #define MBED_WEAK __weak
elmot 1:d0dfbce63a89 116 #else
elmot 1:d0dfbce63a89 117 #define MBED_WEAK __attribute__((weak))
elmot 1:d0dfbce63a89 118 #endif
elmot 1:d0dfbce63a89 119 #endif
elmot 1:d0dfbce63a89 120
elmot 1:d0dfbce63a89 121 /** MBED_PURE
elmot 1:d0dfbce63a89 122 * Hint to the compiler that a function depends only on parameters
elmot 1:d0dfbce63a89 123 *
elmot 1:d0dfbce63a89 124 * @code
elmot 1:d0dfbce63a89 125 * #include "toolchain.h"
elmot 1:d0dfbce63a89 126 *
elmot 1:d0dfbce63a89 127 * MBED_PURE int foo(int arg){
elmot 1:d0dfbce63a89 128 * // no access to global variables
elmot 1:d0dfbce63a89 129 * }
elmot 1:d0dfbce63a89 130 * @endcode
elmot 1:d0dfbce63a89 131 */
elmot 1:d0dfbce63a89 132 #ifndef MBED_PURE
elmot 1:d0dfbce63a89 133 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM)
elmot 1:d0dfbce63a89 134 #define MBED_PURE __attribute__((const))
elmot 1:d0dfbce63a89 135 #else
elmot 1:d0dfbce63a89 136 #define MBED_PURE
elmot 1:d0dfbce63a89 137 #endif
elmot 1:d0dfbce63a89 138 #endif
elmot 1:d0dfbce63a89 139
elmot 1:d0dfbce63a89 140 /** MBED_FORCEINLINE
elmot 1:d0dfbce63a89 141 * Declare a function that must always be inlined. Failure to inline
elmot 1:d0dfbce63a89 142 * such a function will result in an error.
elmot 1:d0dfbce63a89 143 *
elmot 1:d0dfbce63a89 144 * @code
elmot 1:d0dfbce63a89 145 * #include "toolchain.h"
elmot 1:d0dfbce63a89 146 *
elmot 1:d0dfbce63a89 147 * MBED_FORCEINLINE void foo() {
elmot 1:d0dfbce63a89 148 *
elmot 1:d0dfbce63a89 149 * }
elmot 1:d0dfbce63a89 150 * @endcode
elmot 1:d0dfbce63a89 151 */
elmot 1:d0dfbce63a89 152 #ifndef MBED_FORCEINLINE
elmot 1:d0dfbce63a89 153 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM)
elmot 1:d0dfbce63a89 154 #define MBED_FORCEINLINE static inline __attribute__((always_inline))
elmot 1:d0dfbce63a89 155 #elif defined(__ICCARM__)
elmot 1:d0dfbce63a89 156 #define MBED_FORCEINLINE _Pragma("inline=forced") static
elmot 1:d0dfbce63a89 157 #else
elmot 1:d0dfbce63a89 158 #define MBED_FORCEINLINE static inline
elmot 1:d0dfbce63a89 159 #endif
elmot 1:d0dfbce63a89 160 #endif
elmot 1:d0dfbce63a89 161
elmot 1:d0dfbce63a89 162 /** MBED_NORETURN
elmot 1:d0dfbce63a89 163 * Declare a function that will never return.
elmot 1:d0dfbce63a89 164 *
elmot 1:d0dfbce63a89 165 * @code
elmot 1:d0dfbce63a89 166 * #include "toolchain.h"
elmot 1:d0dfbce63a89 167 *
elmot 1:d0dfbce63a89 168 * MBED_NORETURN void foo() {
elmot 1:d0dfbce63a89 169 * // must never return
elmot 1:d0dfbce63a89 170 * while (1) {}
elmot 1:d0dfbce63a89 171 * }
elmot 1:d0dfbce63a89 172 * @endcode
elmot 1:d0dfbce63a89 173 */
elmot 1:d0dfbce63a89 174 #ifndef MBED_NORETURN
elmot 1:d0dfbce63a89 175 #if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM)
elmot 1:d0dfbce63a89 176 #define MBED_NORETURN __attribute__((noreturn))
elmot 1:d0dfbce63a89 177 #elif defined(__ICCARM__)
elmot 1:d0dfbce63a89 178 #define MBED_NORETURN __noreturn
elmot 1:d0dfbce63a89 179 #else
elmot 1:d0dfbce63a89 180 #define MBED_NORETURN
elmot 1:d0dfbce63a89 181 #endif
elmot 1:d0dfbce63a89 182 #endif
elmot 1:d0dfbce63a89 183
elmot 1:d0dfbce63a89 184 /** MBED_UNREACHABLE
elmot 1:d0dfbce63a89 185 * An unreachable statement. If the statement is reached,
elmot 1:d0dfbce63a89 186 * behaviour is undefined. Useful in situations where the compiler
elmot 1:d0dfbce63a89 187 * cannot deduce the unreachability of code.
elmot 1:d0dfbce63a89 188 *
elmot 1:d0dfbce63a89 189 * @code
elmot 1:d0dfbce63a89 190 * #include "toolchain.h"
elmot 1:d0dfbce63a89 191 *
elmot 1:d0dfbce63a89 192 * void foo(int arg) {
elmot 1:d0dfbce63a89 193 * switch (arg) {
elmot 1:d0dfbce63a89 194 * case 1: return 1;
elmot 1:d0dfbce63a89 195 * case 2: return 2;
elmot 1:d0dfbce63a89 196 * ...
elmot 1:d0dfbce63a89 197 * }
elmot 1:d0dfbce63a89 198 * MBED_UNREACHABLE;
elmot 1:d0dfbce63a89 199 * }
elmot 1:d0dfbce63a89 200 * @endcode
elmot 1:d0dfbce63a89 201 */
elmot 1:d0dfbce63a89 202 #ifndef MBED_UNREACHABLE
elmot 1:d0dfbce63a89 203 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM)
elmot 1:d0dfbce63a89 204 #define MBED_UNREACHABLE __builtin_unreachable()
elmot 1:d0dfbce63a89 205 #else
elmot 1:d0dfbce63a89 206 #define MBED_UNREACHABLE while (1)
elmot 1:d0dfbce63a89 207 #endif
elmot 1:d0dfbce63a89 208 #endif
elmot 1:d0dfbce63a89 209
elmot 1:d0dfbce63a89 210 /** MBED_DEPRECATED("message string")
elmot 1:d0dfbce63a89 211 * Mark a function declaration as deprecated, if it used then a warning will be
elmot 1:d0dfbce63a89 212 * issued by the compiler possibly including the provided message. Note that not
elmot 1:d0dfbce63a89 213 * all compilers are able to display the message.
elmot 1:d0dfbce63a89 214 *
elmot 1:d0dfbce63a89 215 * @code
elmot 1:d0dfbce63a89 216 * #include "toolchain.h"
elmot 1:d0dfbce63a89 217 *
elmot 1:d0dfbce63a89 218 * MBED_DEPRECATED("don't foo any more, bar instead")
elmot 1:d0dfbce63a89 219 * void foo(int arg);
elmot 1:d0dfbce63a89 220 * @endcode
elmot 1:d0dfbce63a89 221 */
elmot 1:d0dfbce63a89 222 #ifndef MBED_DEPRECATED
elmot 1:d0dfbce63a89 223 #if defined(__CC_ARM)
elmot 1:d0dfbce63a89 224 #define MBED_DEPRECATED(M) __attribute__((deprecated))
elmot 1:d0dfbce63a89 225 #elif defined(__GNUC__) || defined(__clang__)
elmot 1:d0dfbce63a89 226 #define MBED_DEPRECATED(M) __attribute__((deprecated(M)))
elmot 1:d0dfbce63a89 227 #else
elmot 1:d0dfbce63a89 228 #define MBED_DEPRECATED(M)
elmot 1:d0dfbce63a89 229 #endif
elmot 1:d0dfbce63a89 230 #endif
elmot 1:d0dfbce63a89 231
elmot 1:d0dfbce63a89 232 /** MBED_DEPRECATED_SINCE("version", "message string")
elmot 1:d0dfbce63a89 233 * Mark a function declaration as deprecated, noting that the declaration was
elmot 1:d0dfbce63a89 234 * deprecated on the specified version. If the function is used then a warning
elmot 1:d0dfbce63a89 235 * will be issued by the compiler possibly including the provided message.
elmot 1:d0dfbce63a89 236 * Note that not all compilers are able to display this message.
elmot 1:d0dfbce63a89 237 *
elmot 1:d0dfbce63a89 238 * @code
elmot 1:d0dfbce63a89 239 * #include "toolchain.h"
elmot 1:d0dfbce63a89 240 *
elmot 1:d0dfbce63a89 241 * MBED_DEPRECATED_SINCE("mbed-os-5.1", "don't foo any more, bar instead")
elmot 1:d0dfbce63a89 242 * void foo(int arg);
elmot 1:d0dfbce63a89 243 * @endcode
elmot 1:d0dfbce63a89 244 */
elmot 1:d0dfbce63a89 245 #define MBED_DEPRECATED_SINCE(D, M) MBED_DEPRECATED(M " [since " D "]")
elmot 1:d0dfbce63a89 246
elmot 1:d0dfbce63a89 247 /** MBED_CALLER_ADDR()
elmot 1:d0dfbce63a89 248 * Returns the caller of the current function.
elmot 1:d0dfbce63a89 249 *
elmot 1:d0dfbce63a89 250 * @note
elmot 1:d0dfbce63a89 251 * This macro is only implemented for GCC and ARMCC.
elmot 1:d0dfbce63a89 252 *
elmot 1:d0dfbce63a89 253 * @code
elmot 1:d0dfbce63a89 254 * #include "toolchain.h"
elmot 1:d0dfbce63a89 255 *
elmot 1:d0dfbce63a89 256 * printf("This function was called from %p", MBED_CALLER_ADDR());
elmot 1:d0dfbce63a89 257 * @endcode
elmot 1:d0dfbce63a89 258 *
elmot 1:d0dfbce63a89 259 * @return Address of the calling function
elmot 1:d0dfbce63a89 260 */
elmot 1:d0dfbce63a89 261 #ifndef MBED_CALLER_ADDR
elmot 1:d0dfbce63a89 262 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__CC_ARM)
elmot 1:d0dfbce63a89 263 #define MBED_CALLER_ADDR() __builtin_extract_return_addr(__builtin_return_address(0))
elmot 1:d0dfbce63a89 264 #elif defined(__CC_ARM)
elmot 1:d0dfbce63a89 265 #define MBED_CALLER_ADDR() __builtin_return_address(0)
elmot 1:d0dfbce63a89 266 #else
elmot 1:d0dfbce63a89 267 #define MBED_CALLER_ADDR() (NULL)
elmot 1:d0dfbce63a89 268 #endif
elmot 1:d0dfbce63a89 269 #endif
elmot 1:d0dfbce63a89 270
elmot 1:d0dfbce63a89 271 // FILEHANDLE declaration
elmot 1:d0dfbce63a89 272 #if defined(TOOLCHAIN_ARM)
elmot 1:d0dfbce63a89 273 #include <rt_sys.h>
elmot 1:d0dfbce63a89 274 #endif
elmot 1:d0dfbce63a89 275
elmot 1:d0dfbce63a89 276 #ifndef FILEHANDLE
elmot 1:d0dfbce63a89 277 typedef int FILEHANDLE;
elmot 1:d0dfbce63a89 278 #endif
elmot 1:d0dfbce63a89 279
elmot 1:d0dfbce63a89 280 // Backwards compatibility
elmot 1:d0dfbce63a89 281 #ifndef WEAK
elmot 1:d0dfbce63a89 282 #define WEAK MBED_WEAK
elmot 1:d0dfbce63a89 283 #endif
elmot 1:d0dfbce63a89 284
elmot 1:d0dfbce63a89 285 #ifndef PACKED
elmot 1:d0dfbce63a89 286 #define PACKED MBED_PACKED()
elmot 1:d0dfbce63a89 287 #endif
elmot 1:d0dfbce63a89 288
elmot 1:d0dfbce63a89 289 #ifndef EXTERN
elmot 1:d0dfbce63a89 290 #define EXTERN extern
elmot 1:d0dfbce63a89 291 #endif
elmot 1:d0dfbce63a89 292
elmot 1:d0dfbce63a89 293 #endif
elmot 1:d0dfbce63a89 294
elmot 1:d0dfbce63a89 295 /** @}*/