diff options
| author | hathach <[email protected]> | 2013-09-19 16:11:11 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-09-19 16:11:11 +0700 |
| commit | 86681fe44226c636e62320f3cedcaddcd53259e9 (patch) | |
| tree | cd650952db469968d96bef1f4ea18207d3095b8c /tinyusb/common | |
| parent | 61c591b9ac49022fd287827951cd1f34d4fdbb1a (diff) | |
starting to add support for IAR workbench
Diffstat (limited to 'tinyusb/common')
| -rw-r--r-- | tinyusb/common/assertion.h | 4 | ||||
| -rw-r--r-- | tinyusb/common/compiler/compiler_iar.h | 114 |
2 files changed, 116 insertions, 2 deletions
diff --git a/tinyusb/common/assertion.h b/tinyusb/common/assertion.h index 5e5a84054..7d8b3fcba 100644 --- a/tinyusb/common/assertion.h +++ b/tinyusb/common/assertion.h @@ -60,6 +60,8 @@ extern "C" #include "tusb_option.h" #include "hal/hal.h" // TODO find a way to break hal dependency +#define VOID_RETURN + //--------------------------------------------------------------------+ // Compile-time Assert //--------------------------------------------------------------------+ @@ -95,7 +97,7 @@ extern "C" #ifndef _TEST_ASSERT_ #define ASSERT_ERROR_HANDLER(x, para) \ - return (x) + return x #else #define ASSERT_ERROR_HANDLER(x, para) Throw(x) #endif diff --git a/tinyusb/common/compiler/compiler_iar.h b/tinyusb/common/compiler/compiler_iar.h index aa25d43a6..80373c1c1 100644 --- a/tinyusb/common/compiler/compiler_iar.h +++ b/tinyusb/common/compiler/compiler_iar.h @@ -52,11 +52,123 @@ extern "C" { #endif -#define ALIGN_OF(x) __ALIGNOF__(x) +#define ALIGN_OF(x) __ALIGNOF__(x) +#define ATTR_PACKED_STRUCT(x) __packed x #define ATTR_PREPACKED __packed #define ATTR_PACKED +#define ATTR_ALIGNED(Bytes) ATTR_ALIGNED_##Bytes +#define ATTR_ALIGNED_4096 _Pragma("data_alignment=4096") +#define ATTR_ALIGNED_2048 _Pragma("data_alignment=2048") +#define ATTR_ALIGNED_256 _Pragma("data_alignment=256") +#define ATTR_ALIGNED_128 _Pragma("data_alignment=128") +#define ATTR_ALIGNED_64 _Pragma("data_alignment=64") +#define ATTR_ALIGNED_48 _Pragma("data_alignment=48") +#define ATTR_ALIGNED_32 _Pragma("data_alignment=32") +#define ATTR_ALIGNED_4 _Pragma("data_alignment=4") + + + +#ifndef ATTR_ALWAYS_INLINE +/// Generally, functions are not inlined unless optimization is specified. For functions declared inline, this attribute inlines the function even if no optimization level is specified +#define ATTR_ALWAYS_INLINE error +#endif + +#define ATTR_PURE // TODO IAR pure function attribute +#define ATTR_CONST // TODO IAR const function attribute +#define ATTR_WEAK __weak + +#define ATTR_WARN_UNUSED_RESULT +#define ATTR_USED +#define ATTR_UNUSED + +#if 0 + + /** Indicates to the compiler that the function can not ever return, so that any stack restoring or + * return code may be omitted by the compiler in the resulting binary. + */ + #define ATTR_NO_RETURN + + /** Indicates that the specified parameters of the function are pointers which should never be \c NULL. + * When applied as a 1-based comma separated list the compiler will emit a warning if the specified + * parameters are known at compiler time to be \c NULL at the point of calling the function. + */ + #define ATTR_NON_NULL_PTR_ARG(...) + + /** Removes any preamble or postamble from the function. When used, the function will not have any + * register or stack saving code. This should be used with caution, and when used the programmer + * is responsible for maintaining stack and register integrity. + */ + #define ATTR_NAKED __attribute__ ((naked)) + + /** Prevents the compiler from considering a specified function for in-lining. When applied, the given + * function will not be in-lined under any circumstances. + */ + #define ATTR_NO_INLINE __attribute__ ((noinline)) + + /** Forces the compiler to inline the specified function. When applied, the given function will be + * in-lined under all circumstances. + */ + #define PRAGMA_ALWAYS_INLINE _Pragma("inline=forced") + #define ATTR_ALWAYS_INLINE + + /** Indicates that the specified function is pure, in that it has no side-effects other than global + * or parameter variable access. + */ + #define ATTR_PURE __attribute__ ((pure)) + + /** Indicates that the specified function is constant, in that it has no side effects other than + * parameter access. + */ + #define ATTR_CONST + + /** Marks a given function as deprecated, which produces a warning if the function is called. */ + #define ATTR_DEPRECATED// __attribute__ ((deprecated)) + + /** Marks a function as a weak reference, which can be overridden by other functions with an + * identical name (in which case the weak reference is discarded at link time). + */ + #define _PPTOSTR_(x) #x + #define PRAGMA_WEAK(name, vector) _Pragma(_PPTOSTR_(weak name=vector)) + #define ATTR_WEAK + + /** Marks a function as an alias for another function. + * + * \param[in] Func Name of the function which the given function name should alias. + */ + #define ATTR_ALIAS(Func) + + /** Forces the compiler to not automatically zero the given global variable on startup, so that the + * current RAM contents is retained. Under most conditions this value will be random due to the + * behaviour of volatile memory once power is removed, but may be used in some specific circumstances, + * like the passing of values back after a system watchdog reset. + */ + #define ATTR_NO_INIT __attribute__ ((section (".noinit"))) + /** Indicates the minimum alignment in bytes for a variable or struct element. + * + * \param[in] Bytes Minimum number of bytes the item should be aligned to. + */ + #define PRAGMA_ALIGN_4096 _Pragma("data_alignment=4096") + #define PRAGMA_ALIGN_2048 _Pragma("data_alignment=2048") + #define PRAGMA_ALIGN_256 _Pragma("data_alignment=256") + #define PRAGMA_ALIGN_128 _Pragma("data_alignment=128") + #define PRAGMA_ALIGN_64 _Pragma("data_alignment=64") + #define PRAGMA_ALIGN_48 _Pragma("data_alignment=48") + #define PRAGMA_ALIGN_32 _Pragma("data_alignment=32") + #define PRAGMA_ALIGN_4 _Pragma("data_alignment=4") + #define ATTR_ALIGNED(Bytes) + + //#define ATTR_DEPRECATED __attribute__ ((deprecated)) + + #define ATTR_ERROR(Message)// __attribute__ (( error(Message) )) + + #define ATTR_WARNING(Message) // __attribute__ (( warning(Message) )) + + #define ATTR_IAR_PACKED __packed + #define ATTR_PACKED +#endif + #ifdef __cplusplus } #endif |
