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
Utils/arch.h@43:ec1b7aa823a6, 2019-02-15 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Fri Feb 15 10:48:30 2019 +0100
- Revision:
- 43:ec1b7aa823a6
- Parent:
- arch.h@4:2cee8150ecb6
Moved helper files into Utiles folder to keep it easier for users
Who changed what in which revision?
User | Revision | Line number | New 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__ |