/**************************************************************************//** | |
* @file cmsis_compiler.h | |
* @brief CMSIS compiler generic header file | |
* @version V5.0.4 | |
* @date 10. January 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 (armclang) | |
*/ | |
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | |
#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 | |
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | |
#define __RESTRICT | |
#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 | |
/* | |
* 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 | |
#else | |
#error Unknown compiler. | |
#endif | |
#endif /* __CMSIS_COMPILER_H */ | |