X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fcompiler.h;h=ac60848f5da9eec2b3877e62d8ace28e1ac3847e;hb=a0ba2de64a3964445b392a269ac820c03c5b8385;hp=3426cd06e0bae5733a6eb114f3331fd5d7f8eaa8;hpb=0d4c0c64f736f37dba565aa9e113d3920ef905f9;p=bertos.git diff --git a/bertos/cfg/compiler.h b/bertos/cfg/compiler.h index 3426cd06..ac60848f 100644 --- a/bertos/cfg/compiler.h +++ b/bertos/cfg/compiler.h @@ -82,7 +82,9 @@ /** * usage: + * \code * #define foo_init(...) PP_CAT(foo_init_, COUNT_PARMS(__VA_ARGS__)) (__VA_ARGS__) + * \endcode */ #else @@ -92,7 +94,9 @@ /** * usage: + * \code * #define foo_init(args...) PP_CAT(foo_init_, COUNT_PARMS(args)) (args) + * \endcode */ #endif @@ -205,6 +209,7 @@ #define RESTRICT __restrict__ #define MUST_CHECK __attribute__((warn_unused_result)) #define PACKED __attribute__((packed)) + #define ALIGNED(x) __attribute__ ((__aligned__(x))) #if CPU_ARM | CPU_CM3 #define NAKED __attribute__((naked)) #else @@ -356,6 +361,9 @@ #ifndef PACKED #define PACKED /* nothing */ #endif +#ifndef ALIGNED +#define ALIGNED /* nothing */ +#endif #ifndef MEMORY_BARRIER #define MEMORY_BARRIER /* nothing */ #warning No memory barrier defined for select compiler. If you use the kernel check it. @@ -451,6 +459,14 @@ typedef const void * const_iptr_t; typedef unsigned char sigbit_t; /**< Type for signal bits. */ typedef unsigned char sigmask_t; /**< Type for signal masks. */ +/** + * Signal structure + */ +typedef struct Signal +{ + sigmask_t wait; /**< Signals the process is waiting for */ + sigmask_t recv; /**< Received signals */ +} Signal; /** * \name Standard type definitions. @@ -482,8 +498,8 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ typedef long ssize_t; #elif CPU_ARM || CPU_CM3 typedef int ssize_t; - #elif CPU_AVR - /* 16bit (missing in avr-libc's sys/types.h). */ + #elif CPU_AVR || CPU_MSP430 + /* 16bit (missing in avr-/msp430-libc's sys/types.h). */ typedef int ssize_t; #else #error Unknown CPU @@ -527,7 +543,22 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ * * \note This macro is non-standard, but implements a very common idiom */ - #define countof(a) (sizeof(a) / sizeof(*(a))) + #if defined(__GNUC__) && !defined(__cplusplus) + /* + * Perform a compile time type checking: countof() can only + * work with static arrays, so throw a compile time error if a + * pointer is passed as argument. + * + * NOTE: the construct __builtin_types_compatible_p() is only + * available for C. + */ + #define countof(a) (sizeof(a) / sizeof(*(a)) + \ + STATIC_ASSERT_EXPR( \ + !__builtin_types_compatible_p( \ + typeof(a), typeof(&a[0])))) + #else + #define countof(a) (sizeof(a) / sizeof(*(a))) + #endif #endif #ifndef alignof /** @@ -561,6 +592,13 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ #define STATIC_ASSERT(condition) \ UNUSED_VAR(extern char, STATIC_ASSERTION_FAILED__[(condition) ? 1 : -1]) +/** + * Issue a compilation error if \a __cond is false (this can be used inside an + * expression). + */ +#define STATIC_ASSERT_EXPR(__cond) \ + (sizeof(struct { int STATIC_ASSERTION_FAILED__:!!(__cond); }) * 0) + #ifndef ASSERT_TYPE_EQUAL /** Ensure two variables have the same type. */ #define ASSERT_TYPE_EQUAL(var1, var2) \ @@ -573,4 +611,11 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ do { (void)(&(var) == (type *)0); } while(0) #endif +/** + * Prevent the compiler from optimizing access to the variable \a x, enforcing + * a refetch from memory. This also forbid from reordering successing instances + * of ACCESS_SAFE(). + */ +#define ACCESS_SAFE(x) (*(volatile typeof(x) *)&(x)) + #endif /* BERTOS_COMPILER_H */