An example project for the Heltec Turtle LoRa board (STM32L4 and SX1276 chips). The projects is only supported for the Nucleo-L432KC board platform in the mbed online and offline compiler environment. Visit www.radioshuttle.de (choose Turtle board) for instructions. Note that most source files and libraries are open source, however some files especially the RadioShuttle core protocol is copyrighted work. Check header for details.

Dependencies:   mbed BufferedSerial SX1276GenericLib OLED_SSD1306 HELIOS_Si7021 NVProperty RadioShuttle-STM32L4 USBDeviceHT

Committer:
Helmut Tschemernjak
Date:
Sun Jan 20 16:13:11 2019 +0100
Revision:
4:2cee8150ecb6
new file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut Tschemernjak 4:2cee8150ecb6 1 /*
Helmut Tschemernjak 4:2cee8150ecb6 2 * $Id: config.h,v 1.5 2017/02/23 14:31:38 grimrath Exp $
Helmut Tschemernjak 4:2cee8150ecb6 3 * This is an unpublished work copyright (c) 2019 HELIOS Software GmbH
Helmut Tschemernjak 4:2cee8150ecb6 4 * 30827 Garbsen, Germany
Helmut Tschemernjak 4:2cee8150ecb6 5 */
Helmut Tschemernjak 4:2cee8150ecb6 6 #ifndef __ARCH_H__
Helmut Tschemernjak 4:2cee8150ecb6 7 #define __ARCH_H__
Helmut Tschemernjak 4:2cee8150ecb6 8
Helmut Tschemernjak 4:2cee8150ecb6 9 #ifdef __cplusplus
Helmut Tschemernjak 4:2cee8150ecb6 10 #define _extern_c extern "C"
Helmut Tschemernjak 4:2cee8150ecb6 11 #else
Helmut Tschemernjak 4:2cee8150ecb6 12 #define _extern_c
Helmut Tschemernjak 4:2cee8150ecb6 13 #endif
Helmut Tschemernjak 4:2cee8150ecb6 14
Helmut Tschemernjak 4:2cee8150ecb6 15 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 16 // Definitions to adapt between POSIX and MBED
Helmut Tschemernjak 4:2cee8150ecb6 17 //
Helmut Tschemernjak 4:2cee8150ecb6 18 #ifdef __MBED__
Helmut Tschemernjak 4:2cee8150ecb6 19
Helmut Tschemernjak 4:2cee8150ecb6 20 #include <mbed_assert.h>
Helmut Tschemernjak 4:2cee8150ecb6 21 #include <mbed_debug.h>
Helmut Tschemernjak 4:2cee8150ecb6 22
Helmut Tschemernjak 4:2cee8150ecb6 23 #ifdef TARGET_DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 24 #define DEBUG 1
Helmut Tschemernjak 4:2cee8150ecb6 25 #define STATIC_ASSERT MBED_STATIC_ASSERT
Helmut Tschemernjak 4:2cee8150ecb6 26 #define ASSERT MBED_ASSERT
Helmut Tschemernjak 4:2cee8150ecb6 27 #else
Helmut Tschemernjak 4:2cee8150ecb6 28 #define ASSERT(x) ((void)0)
Helmut Tschemernjak 4:2cee8150ecb6 29 #endif
Helmut Tschemernjak 4:2cee8150ecb6 30
Helmut Tschemernjak 4:2cee8150ecb6 31 #define STATIC_ASSERT MBED_STATIC_ASSERT
Helmut Tschemernjak 4:2cee8150ecb6 32
Helmut Tschemernjak 4:2cee8150ecb6 33 #ifndef TOOLCHAIN_GCC
Helmut Tschemernjak 4:2cee8150ecb6 34 #ifdef __cplusplus
Helmut Tschemernjak 4:2cee8150ecb6 35 using std::size_t;
Helmut Tschemernjak 4:2cee8150ecb6 36 using std::va_list;
Helmut Tschemernjak 4:2cee8150ecb6 37 using std::abort;
Helmut Tschemernjak 4:2cee8150ecb6 38 #endif
Helmut Tschemernjak 4:2cee8150ecb6 39
Helmut Tschemernjak 4:2cee8150ecb6 40 _extern_c size_t strnlen(const char *s, size_t maxlen);
Helmut Tschemernjak 4:2cee8150ecb6 41 _extern_c char *strdup(const char *s);
Helmut Tschemernjak 4:2cee8150ecb6 42 _extern_c char *stpcpy(char *dest, const char *src);
Helmut Tschemernjak 4:2cee8150ecb6 43
Helmut Tschemernjak 4:2cee8150ecb6 44 #endif
Helmut Tschemernjak 4:2cee8150ecb6 45
Helmut Tschemernjak 4:2cee8150ecb6 46 struct iovec {
Helmut Tschemernjak 4:2cee8150ecb6 47 void * iov_base;
Helmut Tschemernjak 4:2cee8150ecb6 48 size_t iov_len;
Helmut Tschemernjak 4:2cee8150ecb6 49 };
Helmut Tschemernjak 4:2cee8150ecb6 50
Helmut Tschemernjak 4:2cee8150ecb6 51
Helmut Tschemernjak 4:2cee8150ecb6 52 static inline unsigned read_systicker_us(void) {
Helmut Tschemernjak 4:2cee8150ecb6 53 extern uint32_t us_ticker_read(void); // I do not want to include us_ticker_api.h here
Helmut Tschemernjak 4:2cee8150ecb6 54
Helmut Tschemernjak 4:2cee8150ecb6 55 return us_ticker_read();
Helmut Tschemernjak 4:2cee8150ecb6 56 }
Helmut Tschemernjak 4:2cee8150ecb6 57
Helmut Tschemernjak 4:2cee8150ecb6 58 #define FlashFileSysMount "Flash"
Helmut Tschemernjak 4:2cee8150ecb6 59 // #define ESPFileSysMount "ESP"
Helmut Tschemernjak 4:2cee8150ecb6 60 #define PseudoFileSysMount "pseudo"
Helmut Tschemernjak 4:2cee8150ecb6 61
Helmut Tschemernjak 4:2cee8150ecb6 62 #else // __MBED__
Helmut Tschemernjak 4:2cee8150ecb6 63
Helmut Tschemernjak 4:2cee8150ecb6 64 #include <assert.h>
Helmut Tschemernjak 4:2cee8150ecb6 65 #include <time.h>
Helmut Tschemernjak 4:2cee8150ecb6 66
Helmut Tschemernjak 4:2cee8150ecb6 67 #ifdef __cplusplus
Helmut Tschemernjak 4:2cee8150ecb6 68 #define STATIC_ASSERT(condition, msg) ((void)sizeof(char[1 - 2*!(condition)]))
Helmut Tschemernjak 4:2cee8150ecb6 69 #else
Helmut Tschemernjak 4:2cee8150ecb6 70 #define STATIC_ASSERT(expr, msg) _Static_assert(expr, msg) // C11 feature
Helmut Tschemernjak 4:2cee8150ecb6 71 #endif
Helmut Tschemernjak 4:2cee8150ecb6 72 #define ASSERT assert
Helmut Tschemernjak 4:2cee8150ecb6 73
Helmut Tschemernjak 4:2cee8150ecb6 74 //static inline unsigned read_systicker_us(void) {
Helmut Tschemernjak 4:2cee8150ecb6 75 // struct timespec ts;
Helmut Tschemernjak 4:2cee8150ecb6 76 // clock_gettime(CLOCK_MONOTONIC, &ts);
Helmut Tschemernjak 4:2cee8150ecb6 77 // return (ts.tv_sec * 1000000) + (ts.tv_nsec / 1000);
Helmut Tschemernjak 4:2cee8150ecb6 78 //}
Helmut Tschemernjak 4:2cee8150ecb6 79
Helmut Tschemernjak 4:2cee8150ecb6 80 #endif // __MBED__
Helmut Tschemernjak 4:2cee8150ecb6 81
Helmut Tschemernjak 4:2cee8150ecb6 82
Helmut Tschemernjak 4:2cee8150ecb6 83 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 84 // synchronize memory contents with external peripherals and interrupt handlers
Helmut Tschemernjak 4:2cee8150ecb6 85 //
Helmut Tschemernjak 4:2cee8150ecb6 86 // __ATOMIC_RELAXED should be ok since we are only dealing with irq handlers on exactly one CPU/MCU
Helmut Tschemernjak 4:2cee8150ecb6 87 //
Helmut Tschemernjak 4:2cee8150ecb6 88 // __atomic_load_n is not available in the online IDE (yet)
Helmut Tschemernjak 4:2cee8150ecb6 89 //
Helmut Tschemernjak 4:2cee8150ecb6 90 #if defined(__ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 91
Helmut Tschemernjak 4:2cee8150ecb6 92 #define help_atomic_load_relaxed(ptr) __atomic_load_n((ptr), __ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 93
Helmut Tschemernjak 4:2cee8150ecb6 94 #define help_atomic_store_relaxed(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 95
Helmut Tschemernjak 4:2cee8150ecb6 96 #define help_atomic_readclr_relaxed(ptr) __atomic_exchange_n((ptr), 0, __ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 97
Helmut Tschemernjak 4:2cee8150ecb6 98 #define help_atomic_or_relaxed(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 99
Helmut Tschemernjak 4:2cee8150ecb6 100 #ifdef __cplusplus
Helmut Tschemernjak 4:2cee8150ecb6 101 template<typename T> inline bool help_atomic_compare_and_swap(T *ptr, T checkval, T newval) {
Helmut Tschemernjak 4:2cee8150ecb6 102 return __atomic_compare_exchange_n(ptr, &checkval, newval, false, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
Helmut Tschemernjak 4:2cee8150ecb6 103 }
Helmut Tschemernjak 4:2cee8150ecb6 104 #else
Helmut Tschemernjak 4:2cee8150ecb6 105 #define help_atomic_compare_and_swap(ptr, checkval, newval) __sync_bool_compare_and_swap((ptr), (checkval), (newval))
Helmut Tschemernjak 4:2cee8150ecb6 106 #endif
Helmut Tschemernjak 4:2cee8150ecb6 107
Helmut Tschemernjak 4:2cee8150ecb6 108 #define sync_memory(mem) do { \
Helmut Tschemernjak 4:2cee8150ecb6 109 asm volatile("" : "=m" (mem)); \
Helmut Tschemernjak 4:2cee8150ecb6 110 __atomic_thread_fence(__ATOMIC_SEQ_CST); \
Helmut Tschemernjak 4:2cee8150ecb6 111 } while (0)
Helmut Tschemernjak 4:2cee8150ecb6 112
Helmut Tschemernjak 4:2cee8150ecb6 113 #define irq_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
Helmut Tschemernjak 4:2cee8150ecb6 114
Helmut Tschemernjak 4:2cee8150ecb6 115 #define sync_memory_all() do { \
Helmut Tschemernjak 4:2cee8150ecb6 116 asm volatile("" : : : "memory"); \
Helmut Tschemernjak 4:2cee8150ecb6 117 __atomic_thread_fence(__ATOMIC_SEQ_CST); \
Helmut Tschemernjak 4:2cee8150ecb6 118 } while (0)
Helmut Tschemernjak 4:2cee8150ecb6 119
Helmut Tschemernjak 4:2cee8150ecb6 120 #else // defined(__ATOMIC_RELAXED)
Helmut Tschemernjak 4:2cee8150ecb6 121
Helmut Tschemernjak 4:2cee8150ecb6 122 #define help_atomic_load_relaxed(ptr) (*(ptr))
Helmut Tschemernjak 4:2cee8150ecb6 123
Helmut Tschemernjak 4:2cee8150ecb6 124 #define help_atomic_store_relaxed(ptr, val) ((void)(*(ptr) = (val)))
Helmut Tschemernjak 4:2cee8150ecb6 125
Helmut Tschemernjak 4:2cee8150ecb6 126 #define help_atomic_readclr_relaxed(ptr) __sync_fetch_and_and((ptr), 0)
Helmut Tschemernjak 4:2cee8150ecb6 127
Helmut Tschemernjak 4:2cee8150ecb6 128 #define help_atomic_or_relaxed(ptr, val) __sync_fetch_and_or((ptr), (val))
Helmut Tschemernjak 4:2cee8150ecb6 129
Helmut Tschemernjak 4:2cee8150ecb6 130 #define help_atomic_compare_and_swap(ptr, checkval, newval) __sync_bool_compare_and_swap((ptr), (checkval), (newval))
Helmut Tschemernjak 4:2cee8150ecb6 131
Helmut Tschemernjak 4:2cee8150ecb6 132 #define sync_memory(mem) __sync_synchronize()
Helmut Tschemernjak 4:2cee8150ecb6 133
Helmut Tschemernjak 4:2cee8150ecb6 134 #define sync_memory_all() __sync_synchronize()
Helmut Tschemernjak 4:2cee8150ecb6 135
Helmut Tschemernjak 4:2cee8150ecb6 136 #define irq_barrier() __sync_synchronize()
Helmut Tschemernjak 4:2cee8150ecb6 137
Helmut Tschemernjak 4:2cee8150ecb6 138 #endif
Helmut Tschemernjak 4:2cee8150ecb6 139
Helmut Tschemernjak 4:2cee8150ecb6 140
Helmut Tschemernjak 4:2cee8150ecb6 141 #define help_atomic_init(ptr, initval) do { *(ptr) = (initval); } while (0)
Helmut Tschemernjak 4:2cee8150ecb6 142
Helmut Tschemernjak 4:2cee8150ecb6 143 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 144 // other
Helmut Tschemernjak 4:2cee8150ecb6 145
Helmut Tschemernjak 4:2cee8150ecb6 146 #define ispowerof2(x) (((x) & ((x) - 1)) == 0)
Helmut Tschemernjak 4:2cee8150ecb6 147
Helmut Tschemernjak 4:2cee8150ecb6 148 static inline uint32_t alignup32(uint32_t size, uint32_t next) {
Helmut Tschemernjak 4:2cee8150ecb6 149 uint32_t next1 = next - 1;
Helmut Tschemernjak 4:2cee8150ecb6 150 ASSERT((next & next1) == 0); // 2^n check
Helmut Tschemernjak 4:2cee8150ecb6 151 return (size + next1) & ~next1;
Helmut Tschemernjak 4:2cee8150ecb6 152 }
Helmut Tschemernjak 4:2cee8150ecb6 153
Helmut Tschemernjak 4:2cee8150ecb6 154
Helmut Tschemernjak 4:2cee8150ecb6 155 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 156 // typesafe macros to get the number of compile-time known array elements.
Helmut Tschemernjak 4:2cee8150ecb6 157 //
Helmut Tschemernjak 4:2cee8150ecb6 158 #ifdef __cplusplus
Helmut Tschemernjak 4:2cee8150ecb6 159
Helmut Tschemernjak 4:2cee8150ecb6 160 template< typename T, std::size_t N > char(&COUNTOF_REQUIRES_ARRAY_ARGUMENT(T(&)[N]))[N];
Helmut Tschemernjak 4:2cee8150ecb6 161 #define ARRAYLEN(x) sizeof(COUNTOF_REQUIRES_ARRAY_ARGUMENT(x))
Helmut Tschemernjak 4:2cee8150ecb6 162
Helmut Tschemernjak 4:2cee8150ecb6 163 #else
Helmut Tschemernjak 4:2cee8150ecb6 164
Helmut Tschemernjak 4:2cee8150ecb6 165 // MBED OS online compiler does not support unnamed and zero sized bitfields as GCC does
Helmut Tschemernjak 4:2cee8150ecb6 166 // #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) // used by Linux kernel
Helmut Tschemernjak 4:2cee8150ecb6 167 #define __must_be_zero(e) (sizeof(struct { char dummy:(1 - 2*!!(e)); }) - 1)
Helmut Tschemernjak 4:2cee8150ecb6 168
Helmut Tschemernjak 4:2cee8150ecb6 169 // __builtin_types_compatible_p: gcc extension, but understood by Intel, clang and ARM compilers too
Helmut Tschemernjak 4:2cee8150ecb6 170 // __builtin_types_compatible_p is not available in C++
Helmut Tschemernjak 4:2cee8150ecb6 171 #define __must_be_array(arr) __must_be_zero(__builtin_types_compatible_p(typeof(arr), typeof(&(arr)[0])))
Helmut Tschemernjak 4:2cee8150ecb6 172
Helmut Tschemernjak 4:2cee8150ecb6 173 #define ARRAYLEN(arr) (sizeof(arr) / sizeof(0[arr])) + __must_be_array(arr)
Helmut Tschemernjak 4:2cee8150ecb6 174
Helmut Tschemernjak 4:2cee8150ecb6 175 #endif
Helmut Tschemernjak 4:2cee8150ecb6 176
Helmut Tschemernjak 4:2cee8150ecb6 177
Helmut Tschemernjak 4:2cee8150ecb6 178 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 179 // quick int32 -> int conversion mainly for printf. Shorter than static_cast<int> and works with C too.
Helmut Tschemernjak 4:2cee8150ecb6 180 //
Helmut Tschemernjak 4:2cee8150ecb6 181 static inline int itoi(int val) { return val; }
Helmut Tschemernjak 4:2cee8150ecb6 182 static inline long long lltoll(long long val) { return val; }
Helmut Tschemernjak 4:2cee8150ecb6 183
Helmut Tschemernjak 4:2cee8150ecb6 184
Helmut Tschemernjak 4:2cee8150ecb6 185 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 186 // Byte order
Helmut Tschemernjak 4:2cee8150ecb6 187 //
Helmut Tschemernjak 4:2cee8150ecb6 188 #ifdef __MBED__
Helmut Tschemernjak 4:2cee8150ecb6 189
Helmut Tschemernjak 4:2cee8150ecb6 190 #if BYTE_ORDER == LITTLE_ENDIAN
Helmut Tschemernjak 4:2cee8150ecb6 191
Helmut Tschemernjak 4:2cee8150ecb6 192 static inline uint16_t htole16(uint16_t x) { return x; }
Helmut Tschemernjak 4:2cee8150ecb6 193 static inline uint16_t le16toh(uint16_t x) { return x; }
Helmut Tschemernjak 4:2cee8150ecb6 194 static inline uint32_t htole32(uint32_t x) { return x; }
Helmut Tschemernjak 4:2cee8150ecb6 195 static inline uint32_t le32toh(uint32_t x) { return x; }
Helmut Tschemernjak 4:2cee8150ecb6 196
Helmut Tschemernjak 4:2cee8150ecb6 197 #else
Helmut Tschemernjak 4:2cee8150ecb6 198
Helmut Tschemernjak 4:2cee8150ecb6 199 // unused big endian variants
Helmut Tschemernjak 4:2cee8150ecb6 200 // static inline uint16_t htobe16(uint16_t x) { return __REV16(x); }
Helmut Tschemernjak 4:2cee8150ecb6 201 // static inline uint16_t be16toh(uint16_t x) { return __REV16(x); }
Helmut Tschemernjak 4:2cee8150ecb6 202 // static inline uint32_t htobe32(uint32_t x) { return __REV(x); }
Helmut Tschemernjak 4:2cee8150ecb6 203 // static inline uint32_t be32toh(uint32_t x) { return __REV(x); }
Helmut Tschemernjak 4:2cee8150ecb6 204
Helmut Tschemernjak 4:2cee8150ecb6 205 #endif
Helmut Tschemernjak 4:2cee8150ecb6 206
Helmut Tschemernjak 4:2cee8150ecb6 207 #elif defined(__linux__)
Helmut Tschemernjak 4:2cee8150ecb6 208
Helmut Tschemernjak 4:2cee8150ecb6 209 #include <endian.h>
Helmut Tschemernjak 4:2cee8150ecb6 210
Helmut Tschemernjak 4:2cee8150ecb6 211 #elif defined(__APPLE__)
Helmut Tschemernjak 4:2cee8150ecb6 212
Helmut Tschemernjak 4:2cee8150ecb6 213 #include <libkern/OSByteOrder.h>
Helmut Tschemernjak 4:2cee8150ecb6 214 #define htole16 OSSwapHostToLittleInt16
Helmut Tschemernjak 4:2cee8150ecb6 215 #define le16toh OSSwapHostToLittleInt16
Helmut Tschemernjak 4:2cee8150ecb6 216 #define htole32 OSSwapHostToLittleInt32
Helmut Tschemernjak 4:2cee8150ecb6 217 #define le32toh OSSwapHostToLittleInt32
Helmut Tschemernjak 4:2cee8150ecb6 218
Helmut Tschemernjak 4:2cee8150ecb6 219 #endif
Helmut Tschemernjak 4:2cee8150ecb6 220
Helmut Tschemernjak 4:2cee8150ecb6 221
Helmut Tschemernjak 4:2cee8150ecb6 222 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 223 // memory debugging
Helmut Tschemernjak 4:2cee8150ecb6 224 //
Helmut Tschemernjak 4:2cee8150ecb6 225 #ifdef DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 226
Helmut Tschemernjak 4:2cee8150ecb6 227 #ifdef USE_VALGRIND
Helmut Tschemernjak 4:2cee8150ecb6 228
Helmut Tschemernjak 4:2cee8150ecb6 229 #include <valgrind/valgrind.h>
Helmut Tschemernjak 4:2cee8150ecb6 230 #include <valgrind/memcheck.h>
Helmut Tschemernjak 4:2cee8150ecb6 231 #include <string.h>
Helmut Tschemernjak 4:2cee8150ecb6 232
Helmut Tschemernjak 4:2cee8150ecb6 233 #define CHECKDEFINED(obj) VALGRIND_CHECK_MEM_IS_DEFINED(&(obj), sizeof(obj))
Helmut Tschemernjak 4:2cee8150ecb6 234
Helmut Tschemernjak 4:2cee8150ecb6 235 #endif // ! valgrind
Helmut Tschemernjak 4:2cee8150ecb6 236
Helmut Tschemernjak 4:2cee8150ecb6 237 static inline void POISONMEM(void *ptr, size_t sz) {
Helmut Tschemernjak 4:2cee8150ecb6 238 memset(ptr, 0x55, sz);
Helmut Tschemernjak 4:2cee8150ecb6 239 #ifdef USE_VALGRIND
Helmut Tschemernjak 4:2cee8150ecb6 240 VALGRIND_MAKE_MEM_UNDEFINED(ptr, sz);
Helmut Tschemernjak 4:2cee8150ecb6 241 #endif
Helmut Tschemernjak 4:2cee8150ecb6 242 }
Helmut Tschemernjak 4:2cee8150ecb6 243
Helmut Tschemernjak 4:2cee8150ecb6 244 #define POISON(obj) POISONMEM(&(obj), sizeof(obj))
Helmut Tschemernjak 4:2cee8150ecb6 245
Helmut Tschemernjak 4:2cee8150ecb6 246 #else // ! DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 247
Helmut Tschemernjak 4:2cee8150ecb6 248 #ifdef USE_VALGRIND
Helmut Tschemernjak 4:2cee8150ecb6 249 #error valgrind features only useable in debug builds
Helmut Tschemernjak 4:2cee8150ecb6 250 #endif
Helmut Tschemernjak 4:2cee8150ecb6 251
Helmut Tschemernjak 4:2cee8150ecb6 252 static inline void POISONMEM(void *ptr, size_t sz) { (void)ptr; (void)sz; }
Helmut Tschemernjak 4:2cee8150ecb6 253
Helmut Tschemernjak 4:2cee8150ecb6 254 #define POISON(obj) ((void)0)
Helmut Tschemernjak 4:2cee8150ecb6 255
Helmut Tschemernjak 4:2cee8150ecb6 256 #endif // DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 257
Helmut Tschemernjak 4:2cee8150ecb6 258 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 259 // Macros to live bookmark code
Helmut Tschemernjak 4:2cee8150ecb6 260 //
Helmut Tschemernjak 4:2cee8150ecb6 261 #ifdef DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 262
Helmut Tschemernjak 4:2cee8150ecb6 263 _extern_c void dbg_fail_handler(const char *file, int line, const char *func, const char *msg) __attribute__((noreturn));
Helmut Tschemernjak 4:2cee8150ecb6 264
Helmut Tschemernjak 4:2cee8150ecb6 265 #define TODO(...) dbg_fail_handler(__FILE__, __LINE__, __func__, "TODO" __VA_ARGS__)
Helmut Tschemernjak 4:2cee8150ecb6 266 #define UNTESTED() dbg_fail_handler(__FILE__, __LINE__, __func__, "UNTESTED")
Helmut Tschemernjak 4:2cee8150ecb6 267 #define UNREACHABLE() dbg_fail_handler(__FILE__, __LINE__, __func__, "UNREACHABLE")
Helmut Tschemernjak 4:2cee8150ecb6 268 #if defined(__x86_64__) || defined(__i386__)
Helmut Tschemernjak 4:2cee8150ecb6 269 #define BREAKPOINT() asm("int $3")
Helmut Tschemernjak 4:2cee8150ecb6 270 #elif defined(__arm__)
Helmut Tschemernjak 4:2cee8150ecb6 271 #define BREAKPOINT() __BKPT(0)
Helmut Tschemernjak 4:2cee8150ecb6 272 #else
Helmut Tschemernjak 4:2cee8150ecb6 273 #error no compile time breakpoints supplied for this architecture - add them if needed
Helmut Tschemernjak 4:2cee8150ecb6 274 #endif
Helmut Tschemernjak 4:2cee8150ecb6 275
Helmut Tschemernjak 4:2cee8150ecb6 276 #else // ! debug
Helmut Tschemernjak 4:2cee8150ecb6 277
Helmut Tschemernjak 4:2cee8150ecb6 278 #define TODO(...) abort()
Helmut Tschemernjak 4:2cee8150ecb6 279 #define UNTESTED() ((void)0)
Helmut Tschemernjak 4:2cee8150ecb6 280 #ifdef __MBED__
Helmut Tschemernjak 4:2cee8150ecb6 281 # define UNREACHABLE() MBED_UNREACHABLE
Helmut Tschemernjak 4:2cee8150ecb6 282 #else
Helmut Tschemernjak 4:2cee8150ecb6 283 # define UNREACHABLE() __builtin_unreachable()
Helmut Tschemernjak 4:2cee8150ecb6 284 #endif
Helmut Tschemernjak 4:2cee8150ecb6 285 // no BREAKPOINT() - these must be removed in release builds
Helmut Tschemernjak 4:2cee8150ecb6 286
Helmut Tschemernjak 4:2cee8150ecb6 287 #endif // debug
Helmut Tschemernjak 4:2cee8150ecb6 288
Helmut Tschemernjak 4:2cee8150ecb6 289
Helmut Tschemernjak 4:2cee8150ecb6 290
Helmut Tschemernjak 4:2cee8150ecb6 291 // --------------------------------------------------------------------------------------------------------------------
Helmut Tschemernjak 4:2cee8150ecb6 292 // Tracing
Helmut Tschemernjak 4:2cee8150ecb6 293 //
Helmut Tschemernjak 4:2cee8150ecb6 294 #ifdef DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 295
Helmut Tschemernjak 4:2cee8150ecb6 296 // Do not call these directly, use DTRC
Helmut Tschemernjak 4:2cee8150ecb6 297 _extern_c void trc_dbg(const char *file, int line, const char *func, const char *fmt, ...) __attribute__((format(printf,4,5)));
Helmut Tschemernjak 4:2cee8150ecb6 298 _extern_c void trc_vdbg(const char *file, int line, const char *func, const char *fmt, va_list ap);
Helmut Tschemernjak 4:2cee8150ecb6 299
Helmut Tschemernjak 4:2cee8150ecb6 300 #define DTRC(_fmt, ...) trc_dbg(__FILE__, __LINE__, __func__, (_fmt), ## __VA_ARGS__)
Helmut Tschemernjak 4:2cee8150ecb6 301
Helmut Tschemernjak 4:2cee8150ecb6 302
Helmut Tschemernjak 4:2cee8150ecb6 303 #else // DEBUG
Helmut Tschemernjak 4:2cee8150ecb6 304
Helmut Tschemernjak 4:2cee8150ecb6 305 #define DTRC(_fmt, ...) ((void)0)
Helmut Tschemernjak 4:2cee8150ecb6 306
Helmut Tschemernjak 4:2cee8150ecb6 307 #endif
Helmut Tschemernjak 4:2cee8150ecb6 308
Helmut Tschemernjak 4:2cee8150ecb6 309 // Do not call these directly, use TRC_* macros
Helmut Tschemernjak 4:2cee8150ecb6 310 _extern_c void trc_printf(const char *fmt, ...) __attribute__((format(printf,1,2)));
Helmut Tschemernjak 4:2cee8150ecb6 311 _extern_c void trc_vprintf(const char *fmt, va_list ap);
Helmut Tschemernjak 4:2cee8150ecb6 312
Helmut Tschemernjak 4:2cee8150ecb6 313 // These exists even in release builds
Helmut Tschemernjak 4:2cee8150ecb6 314 #define TRC_INF(_fmt, ...) trc_printf((_fmt), ## __VA_ARGS__)
Helmut Tschemernjak 4:2cee8150ecb6 315 #define TRC_WRN TRC_INF
Helmut Tschemernjak 4:2cee8150ecb6 316 #define TRC_ERR TRC_INF
Helmut Tschemernjak 4:2cee8150ecb6 317 #define TRC_VERR(fmt, ap) trc_vprintf((fmt), (ap))
Helmut Tschemernjak 4:2cee8150ecb6 318
Helmut Tschemernjak 4:2cee8150ecb6 319 #endif // __ARCH_H__