You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
9.3 KiB
283 lines
9.3 KiB
/**************************************************************************//** |
|
* @file cmsis_compiler.h |
|
* @brief CMSIS compiler generic header file |
|
* @version V5.1.0 |
|
* @date 09. October 2018 |
|
******************************************************************************/ |
|
/* |
|
* Copyright (c) 2009-2018 Arm Limited. All rights reserved. |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the License); you may |
|
* not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT |
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
#ifndef __CMSIS_COMPILER_H |
|
#define __CMSIS_COMPILER_H |
|
|
|
#include <stdint.h> |
|
|
|
/* |
|
* Arm Compiler 4/5 |
|
*/ |
|
#if defined ( __CC_ARM ) |
|
#include "cmsis_armcc.h" |
|
|
|
|
|
/* |
|
* Arm Compiler 6.6 LTM (armclang) |
|
*/ |
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) |
|
#include "cmsis_armclang_ltm.h" |
|
|
|
/* |
|
* Arm Compiler above 6.10.1 (armclang) |
|
*/ |
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) |
|
#include "cmsis_armclang.h" |
|
|
|
|
|
/* |
|
* GNU Compiler |
|
*/ |
|
#elif defined ( __GNUC__ ) |
|
#include "cmsis_gcc.h" |
|
|
|
|
|
/* |
|
* IAR Compiler |
|
*/ |
|
#elif defined ( __ICCARM__ ) |
|
#include <cmsis_iccarm.h> |
|
|
|
|
|
/* |
|
* TI Arm Compiler |
|
*/ |
|
#elif defined ( __TI_ARM__ ) |
|
#include <cmsis_ccs.h> |
|
|
|
#ifndef __ASM |
|
#define __ASM __asm |
|
#endif |
|
#ifndef __INLINE |
|
#define __INLINE inline |
|
#endif |
|
#ifndef __STATIC_INLINE |
|
#define __STATIC_INLINE static inline |
|
#endif |
|
#ifndef __STATIC_FORCEINLINE |
|
#define __STATIC_FORCEINLINE __STATIC_INLINE |
|
#endif |
|
#ifndef __NO_RETURN |
|
#define __NO_RETURN __attribute__((noreturn)) |
|
#endif |
|
#ifndef __USED |
|
#define __USED __attribute__((used)) |
|
#endif |
|
#ifndef __WEAK |
|
#define __WEAK __attribute__((weak)) |
|
#endif |
|
#ifndef __PACKED |
|
#define __PACKED __attribute__((packed)) |
|
#endif |
|
#ifndef __PACKED_STRUCT |
|
#define __PACKED_STRUCT struct __attribute__((packed)) |
|
#endif |
|
#ifndef __PACKED_UNION |
|
#define __PACKED_UNION union __attribute__((packed)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32 /* deprecated */ |
|
struct __attribute__((packed)) T_UINT32 { uint32_t v; }; |
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_WRITE |
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_READ |
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_WRITE |
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_READ |
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __ALIGNED |
|
#define __ALIGNED(x) __attribute__((aligned(x))) |
|
#endif |
|
#ifndef __RESTRICT |
|
#define __RESTRICT __restrict |
|
#endif |
|
#ifndef __COMPILER_BARRIER |
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
|
#define __COMPILER_BARRIER() (void)0 |
|
#endif |
|
|
|
|
|
/* |
|
* TASKING Compiler |
|
*/ |
|
#elif defined ( __TASKING__ ) |
|
/* |
|
* The CMSIS functions have been implemented as intrinsics in the compiler. |
|
* Please use "carm -?i" to get an up to date list of all intrinsics, |
|
* Including the CMSIS ones. |
|
*/ |
|
|
|
#ifndef __ASM |
|
#define __ASM __asm |
|
#endif |
|
#ifndef __INLINE |
|
#define __INLINE inline |
|
#endif |
|
#ifndef __STATIC_INLINE |
|
#define __STATIC_INLINE static inline |
|
#endif |
|
#ifndef __STATIC_FORCEINLINE |
|
#define __STATIC_FORCEINLINE __STATIC_INLINE |
|
#endif |
|
#ifndef __NO_RETURN |
|
#define __NO_RETURN __attribute__((noreturn)) |
|
#endif |
|
#ifndef __USED |
|
#define __USED __attribute__((used)) |
|
#endif |
|
#ifndef __WEAK |
|
#define __WEAK __attribute__((weak)) |
|
#endif |
|
#ifndef __PACKED |
|
#define __PACKED __packed__ |
|
#endif |
|
#ifndef __PACKED_STRUCT |
|
#define __PACKED_STRUCT struct __packed__ |
|
#endif |
|
#ifndef __PACKED_UNION |
|
#define __PACKED_UNION union __packed__ |
|
#endif |
|
#ifndef __UNALIGNED_UINT32 /* deprecated */ |
|
struct __packed__ T_UINT32 { uint32_t v; }; |
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_WRITE |
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_READ |
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_WRITE |
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_READ |
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __ALIGNED |
|
#define __ALIGNED(x) __align(x) |
|
#endif |
|
#ifndef __RESTRICT |
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. |
|
#define __RESTRICT |
|
#endif |
|
#ifndef __COMPILER_BARRIER |
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
|
#define __COMPILER_BARRIER() (void)0 |
|
#endif |
|
|
|
|
|
/* |
|
* COSMIC Compiler |
|
*/ |
|
#elif defined ( __CSMC__ ) |
|
#include <cmsis_csm.h> |
|
|
|
#ifndef __ASM |
|
#define __ASM _asm |
|
#endif |
|
#ifndef __INLINE |
|
#define __INLINE inline |
|
#endif |
|
#ifndef __STATIC_INLINE |
|
#define __STATIC_INLINE static inline |
|
#endif |
|
#ifndef __STATIC_FORCEINLINE |
|
#define __STATIC_FORCEINLINE __STATIC_INLINE |
|
#endif |
|
#ifndef __NO_RETURN |
|
// NO RETURN is automatically detected hence no warning here |
|
#define __NO_RETURN |
|
#endif |
|
#ifndef __USED |
|
#warning No compiler specific solution for __USED. __USED is ignored. |
|
#define __USED |
|
#endif |
|
#ifndef __WEAK |
|
#define __WEAK __weak |
|
#endif |
|
#ifndef __PACKED |
|
#define __PACKED @packed |
|
#endif |
|
#ifndef __PACKED_STRUCT |
|
#define __PACKED_STRUCT @packed struct |
|
#endif |
|
#ifndef __PACKED_UNION |
|
#define __PACKED_UNION @packed union |
|
#endif |
|
#ifndef __UNALIGNED_UINT32 /* deprecated */ |
|
@packed struct T_UINT32 { uint32_t v; }; |
|
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_WRITE |
|
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT16_READ |
|
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
|
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_WRITE |
|
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
|
#endif |
|
#ifndef __UNALIGNED_UINT32_READ |
|
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
|
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) |
|
#endif |
|
#ifndef __ALIGNED |
|
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. |
|
#define __ALIGNED(x) |
|
#endif |
|
#ifndef __RESTRICT |
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. |
|
#define __RESTRICT |
|
#endif |
|
#ifndef __COMPILER_BARRIER |
|
#warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
|
#define __COMPILER_BARRIER() (void)0 |
|
#endif |
|
|
|
|
|
#else |
|
#error Unknown compiler. |
|
#endif |
|
|
|
|
|
#endif /* __CMSIS_COMPILER_H */ |
|
|
|
|