#ifndef SCFGCOMPILERS_H #define SCFGCOMPILERS_H /* https://gcc-renesas.com/migration-guides/rx/index.html#Compiler_directives https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/RX-Function-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html */ #if defined(__CCRX__) /* supported */ #elif defined(__GNUC__) /* supported */ #elif defined(__ICCRX__) /* not supported yet */ #error "IAR RX compiler is not supported yet" /* http://netstorage.iar.com/SuppDB/Public/UPDINFO/007248/ew/doc/EWRX_MigratingFromRenesasHEWRX.pdf */ #else #error "Unrecognized compiler" #endif #define R_PRAGMA(...) _Pragma(#__VA_ARGS__) #if defined(__CCRX__) #define R_PRAGMA_PACK R_PRAGMA(pack) #define R_PRAGMA_UNPACK R_PRAGMA(unpack) #define R_PRAGMA_PACKOPTION R_PRAGMA(packoption) #elif defined(__GNUC__) #define R_PRAGMA_PACK R_PRAGMA(pack(1)) #define R_PRAGMA_UNPACK R_PRAGMA(pack(4)) #define R_PRAGMA_PACKOPTION R_PRAGMA(pack()) #endif #if defined(__CCRX__) #define R_PRAGMA_INTERRUPT(function_name, vector) R_PRAGMA(interrupt function_name(vect=vector))\ extern void function_name(void); #define R_PRAGMA_STATIC_INTERRUPT(function_name, vector) R_PRAGMA(interrupt function_name(vect=vector))\ static void function_name(void); //TODO: fast interrupt //TODO: exception (i.e. without vector) //TODO: vector only #elif defined(__GNUC__) #define R_PRAGMA_INTERRUPT(function_name, vector) extern void function_name(void) __attribute__((interrupt(".rvectors", vector))); #define R_PRAGMA_STATIC_INTERRUPT(function_name, vector) static void function_name(void) __attribute__((interrupt(".rvectors", vector), used)); //TODO: fast interrupt //TODO: exception (i.e. without vector) //TODO: vector only #endif //TODO: __attribute__((always_inline)) should be used for GNURX? #define R_ATTRIB_INLINE inline extern #define R_ATTRIB_STATIC_INLINE inline static #define R_PRAGMA_INLINE(function_prototype) R_ATTRIB_INLINE function_prototype; #define R_PRAGMA_STATIC_INLINE(function_prototype) R_ATTRIB_STATIC_INLINE function_prototype; #if defined(__CCRX__) #define R_BITFIELD_BIT_ORDER_LEFT_2(bf1, bf2)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_3(bf1, bf2, bf3)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_4(bf1, bf2, bf3, bf4)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_5(bf1, bf2, bf3, bf4, bf5)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_7(bf1, bf2, bf3, bf4, bf5, bf6, bf7)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_8(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ bf8;\ };\ R_PRAGMA(bit_order)\ } #define R_BITFIELD_BIT_ORDER_LEFT_9(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8, bf9)\ struct {\ R_PRAGMA(bit_order left)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ bf8;\ bf9;\ };\ R_PRAGMA(bit_order)\ } #elif defined(__GNUC__) #if defined(__RX_LITTLE_ENDIAN__) #define R_BITFIELD_BIT_ORDER_LEFT_2(bf1, bf2)\ struct {\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_3(bf1, bf2, bf3)\ struct {\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_4(bf1, bf2, bf3, bf4)\ struct {\ bf4;\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_5(bf1, bf2, bf3, bf4, bf5)\ struct {\ bf5;\ bf4;\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\ struct {\ bf6;\ bf5;\ bf4;\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_7(bf1, bf2, bf3, bf4, bf5, bf6, bf7)\ struct {\ bf7;\ bf6;\ bf5;\ bf4;\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_8(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8)\ struct {\ bf8;\ bf7;\ bf6;\ bf5;\ bf4;\ bf3;\ bf2;\ bf1;\ } #define R_BITFIELD_BIT_ORDER_LEFT_9(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8, bf9)\ struct {\ bf9;\ bf8;\ bf7;\ bf6;\ bf5;\ bf4;\ bf3;\ bf2;\ bf1;\ } #else #define R_BITFIELD_BIT_ORDER_LEFT_(bf1, bf2)\ struct {\ bf1;\ bf2;\ } #define R_BITFIELD_BIT_ORDER_LEFT_3(bf1, bf2, bf3)\ struct {\ bf1;\ bf2;\ bf3;\ } #define R_BITFIELD_BIT_ORDER_LEFT_4(bf1, bf2, bf3, bf4)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ } #define R_BITFIELD_BIT_ORDER_LEFT_5(bf1, bf2, bf3, bf4, bf5)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ } #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ } #define R_BITFIELD_BIT_ORDER_LEFT_7(bf1, bf2, bf3, bf4, bf5, bf6, bf7)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ } #define R_BITFIELD_BIT_ORDER_LEFT_8(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ bf8;\ } #define R_BITFIELD_BIT_ORDER_LEFT_9(bf1, bf2, bf3, bf4, bf5, bf6, bf7, bf8, bf9)\ struct {\ bf1;\ bf2;\ bf3;\ bf4;\ bf5;\ bf6;\ bf7;\ bf8;\ bf9;\ } #endif #endif #if defined(__CCRX__) #define R_ATTRIB_SECTION_CHANGE(section_name) R_PRAGMA(section section_name) #define R_ATTRIB_SECTION_CHANGE_END R_PRAGMA(section) #elif defined(__GNUC__) #define R_ATTRIB_SECTION_CHANGE(section_name) __attribute__((section(#section_name))) #define R_ATTRIB_SECTION_CHANGE_END /* none */ #endif #if defined(__CCRX__) /* #define volatile volatile __evenaccess |* I guess this is a bad practice, but ... */ #elif defined(__GNUC__) #define __evenaccess /* none */ #endif /* https://gcc-renesas.com/migration-guides/rx/index.html#Compiler_predefined */ #if defined(__CCRX__) /* maybe nothing to do */ #elif defined(__GNUC__) #define __RX 1 #if defined(__RX_LITTLE_ENDIAN__) #define __LIT 1 #else #define __BIG 1 #endif #endif #endif /* SCFGCOMPILERS_H */