1 /**************************************************************************//** 2 * @file cmsis_compiler.h 3 * @brief CMSIS compiler generic header file 4 * @version V5.3.0 5 * @date 04. April 2023 6 ******************************************************************************/ 7 /* 8 * Copyright (c) 2009-2023 Arm Limited. All rights reserved. 9 * 10 * SPDX-License-Identifier: Apache-2.0 11 * 12 * Licensed under the Apache License, Version 2.0 (the License); you may 13 * not use this file except in compliance with the License. 14 * You may obtain a copy of the License at 15 * 16 * www.apache.org/licenses/LICENSE-2.0 17 * 18 * Unless required by applicable law or agreed to in writing, software 19 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 20 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 21 * See the License for the specific language governing permissions and 22 * limitations under the License. 23 */ 24 25 #ifndef __CMSIS_COMPILER_H 26 #define __CMSIS_COMPILER_H 27 28 #include <stdint.h> 29 30 /* 31 * Arm Compiler 4/5 32 */ 33 #if defined ( __CC_ARM ) 34 #include "cmsis_armcc.h" 35 36 37 /* 38 * Arm Compiler 6.6 LTM (armclang) 39 */ 40 #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) 41 #include "cmsis_armclang_ltm.h" 42 43 /* 44 * Arm Compiler above 6.10.1 (armclang) 45 */ 46 #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) 47 #include "cmsis_armclang.h" 48 49 /* 50 * TI Arm Clang Compiler (tiarmclang) 51 */ 52 #elif defined (__ti__) 53 #include "cmsis_tiarmclang.h" 54 55 /* 56 * GNU Compiler 57 */ 58 #elif defined ( __GNUC__ ) 59 #include "cmsis_gcc.h" 60 61 62 /* 63 * IAR Compiler 64 */ 65 #elif defined ( __ICCARM__ ) 66 #include <cmsis_iccarm.h> 67 68 69 /* 70 * TI Arm Compiler (armcl) 71 */ 72 #elif defined ( __TI_ARM__ ) 73 #include <cmsis_ccs.h> 74 75 #ifndef __ASM 76 #define __ASM __asm 77 #endif 78 #ifndef __INLINE 79 #define __INLINE inline 80 #endif 81 #ifndef __STATIC_INLINE 82 #define __STATIC_INLINE static inline 83 #endif 84 #ifndef __STATIC_FORCEINLINE 85 #define __STATIC_FORCEINLINE __STATIC_INLINE 86 #endif 87 #ifndef __NO_RETURN 88 #define __NO_RETURN __attribute__((noreturn)) 89 #endif 90 #ifndef __USED 91 #define __USED __attribute__((used)) 92 #endif 93 #ifndef __WEAK 94 #define __WEAK __attribute__((weak)) 95 #endif 96 #ifndef __PACKED 97 #define __PACKED __attribute__((packed)) 98 #endif 99 #ifndef __PACKED_STRUCT 100 #define __PACKED_STRUCT struct __attribute__((packed)) 101 #endif 102 #ifndef __PACKED_UNION 103 #define __PACKED_UNION union __attribute__((packed)) 104 #endif 105 #ifndef __UNALIGNED_UINT32 /* deprecated */ 106 struct __attribute__((packed)) T_UINT32 { uint32_t v; }; 107 #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) 108 #endif 109 #ifndef __UNALIGNED_UINT16_WRITE 110 __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; 111 #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) 112 #endif 113 #ifndef __UNALIGNED_UINT16_READ 114 __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; 115 #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) 116 #endif 117 #ifndef __UNALIGNED_UINT32_WRITE 118 __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; 119 #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) 120 #endif 121 #ifndef __UNALIGNED_UINT32_READ 122 __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; 123 #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) 124 #endif 125 #ifndef __ALIGNED 126 #define __ALIGNED(x) __attribute__((aligned(x))) 127 #endif 128 #ifndef __RESTRICT 129 #define __RESTRICT __restrict 130 #endif 131 #ifndef __COMPILER_BARRIER 132 #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. 133 #define __COMPILER_BARRIER() (void)0 134 #endif 135 #ifndef __NO_INIT 136 #define __NO_INIT __attribute__ ((section (".bss.noinit"))) 137 #endif 138 #ifndef __ALIAS 139 #define __ALIAS(x) __attribute__ ((alias(x))) 140 #endif 141 142 /* 143 * TASKING Compiler 144 */ 145 #elif defined ( __TASKING__ ) 146 /* 147 * The CMSIS functions have been implemented as intrinsics in the compiler. 148 * Please use "carm -?i" to get an up to date list of all intrinsics, 149 * Including the CMSIS ones. 150 */ 151 152 #ifndef __ASM 153 #define __ASM __asm 154 #endif 155 #ifndef __INLINE 156 #define __INLINE inline 157 #endif 158 #ifndef __STATIC_INLINE 159 #define __STATIC_INLINE static inline 160 #endif 161 #ifndef __STATIC_FORCEINLINE 162 #define __STATIC_FORCEINLINE __STATIC_INLINE 163 #endif 164 #ifndef __NO_RETURN 165 #define __NO_RETURN __attribute__((noreturn)) 166 #endif 167 #ifndef __USED 168 #define __USED __attribute__((used)) 169 #endif 170 #ifndef __WEAK 171 #define __WEAK __attribute__((weak)) 172 #endif 173 #ifndef __PACKED 174 #define __PACKED __packed__ 175 #endif 176 #ifndef __PACKED_STRUCT 177 #define __PACKED_STRUCT struct __packed__ 178 #endif 179 #ifndef __PACKED_UNION 180 #define __PACKED_UNION union __packed__ 181 #endif 182 #ifndef __UNALIGNED_UINT32 /* deprecated */ 183 struct __packed__ T_UINT32 { uint32_t v; }; 184 #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) 185 #endif 186 #ifndef __UNALIGNED_UINT16_WRITE 187 __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; 188 #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) 189 #endif 190 #ifndef __UNALIGNED_UINT16_READ 191 __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; 192 #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) 193 #endif 194 #ifndef __UNALIGNED_UINT32_WRITE 195 __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; 196 #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) 197 #endif 198 #ifndef __UNALIGNED_UINT32_READ 199 __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; 200 #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) 201 #endif 202 #ifndef __ALIGNED 203 #define __ALIGNED(x) __align(x) 204 #endif 205 #ifndef __RESTRICT 206 #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. 207 #define __RESTRICT 208 #endif 209 #ifndef __COMPILER_BARRIER 210 #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. 211 #define __COMPILER_BARRIER() (void)0 212 #endif 213 #ifndef __NO_INIT 214 #define __NO_INIT __attribute__ ((section (".bss.noinit"))) 215 #endif 216 #ifndef __ALIAS 217 #define __ALIAS(x) __attribute__ ((alias(x))) 218 #endif 219 220 /* 221 * COSMIC Compiler 222 */ 223 #elif defined ( __CSMC__ ) 224 #include <cmsis_csm.h> 225 226 #ifndef __ASM 227 #define __ASM _asm 228 #endif 229 #ifndef __INLINE 230 #define __INLINE inline 231 #endif 232 #ifndef __STATIC_INLINE 233 #define __STATIC_INLINE static inline 234 #endif 235 #ifndef __STATIC_FORCEINLINE 236 #define __STATIC_FORCEINLINE __STATIC_INLINE 237 #endif 238 #ifndef __NO_RETURN 239 // NO RETURN is automatically detected hence no warning here 240 #define __NO_RETURN 241 #endif 242 #ifndef __USED 243 #warning No compiler specific solution for __USED. __USED is ignored. 244 #define __USED 245 #endif 246 #ifndef __WEAK 247 #define __WEAK __weak 248 #endif 249 #ifndef __PACKED 250 #define __PACKED @packed 251 #endif 252 #ifndef __PACKED_STRUCT 253 #define __PACKED_STRUCT @packed struct 254 #endif 255 #ifndef __PACKED_UNION 256 #define __PACKED_UNION @packed union 257 #endif 258 #ifndef __UNALIGNED_UINT32 /* deprecated */ 259 @packed struct T_UINT32 { uint32_t v; }; 260 #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) 261 #endif 262 #ifndef __UNALIGNED_UINT16_WRITE 263 __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; 264 #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) 265 #endif 266 #ifndef __UNALIGNED_UINT16_READ 267 __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; 268 #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) 269 #endif 270 #ifndef __UNALIGNED_UINT32_WRITE 271 __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; 272 #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) 273 #endif 274 #ifndef __UNALIGNED_UINT32_READ 275 __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; 276 #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) 277 #endif 278 #ifndef __ALIGNED 279 #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. 280 #define __ALIGNED(x) 281 #endif 282 #ifndef __RESTRICT 283 #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. 284 #define __RESTRICT 285 #endif 286 #ifndef __COMPILER_BARRIER 287 #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. 288 #define __COMPILER_BARRIER() (void)0 289 #endif 290 #ifndef __NO_INIT 291 #define __NO_INIT __attribute__ ((section (".bss.noinit"))) 292 #endif 293 #ifndef __ALIAS 294 #define __ALIAS(x) __attribute__ ((alias(x))) 295 #endif 296 297 #else 298 #error Unknown compiler. 299 #endif 300 301 302 #endif /* __CMSIS_COMPILER_H */ 303 304