CC-RXもGNURXもC99仕様では_Pragmaプリプロセッサ演算子というものが使えるのですね(FITのコンパイラ対応の効率化に役立ちそうかも)

こんにちは。NoMaYです。

別スレッド『Amazon FreeRTOSだそうです。ルネサスさんのRXは参加しないのかな?』でCC-RX用プロジェクトをGNURX用プロジェクトへ移植する作業をぽつりぽつりとやっていて、CC-RXの#pragma pack / #pragma packoption相当のものとしてGNURXで#pragma pack(1) / #pragma pack()が使えることに気付いたのですが、たまたま同じタイミングで更に別スレッドの作業をやっていてGNURXで#pragma address 変数名 アドレスという記述が使えるらしいことに気付き、調べているうちにFITが前提としているC99仕様では_Pragmaプリプロセッサ演算子(関連リンク参照)というものが使えることを知りました。_Pragmaを使うと以下のように#pragmaをプリプロセッサで扱うことが出来るようになり、FITのコンパイラ対応の効率化に役立ちそうかも知れないと思いました。

#define R_PRAGMA(...) _Pragma(#__VA_ARGS__)

#if defined(__CCRX__)

#define R_PRAGMA_PACK       R_PRAGMA(pack)
#define R_PRAGMA_PACKOPTION R_PRAGMA(packoption)

#elif defined(__GNUC__)

#define R_PRAGMA_PACK       R_PRAGMA(pack(1))
#define R_PRAGMA_PACKOPTION R_PRAGMA(pack())

#endif
/*
 * EDMAC descriptor as defined in the hardware manual. It is
 * modified to support little endian CPU mode.
 */
    R_PRAGMA_PACK

typedef struct DescriptorS
{
    __evenaccess uint32_t           status;
    #if __LIT
    /* Little endian */
    __evenaccess uint16_t           size;
    __evenaccess uint16_t           bufsize;
    #else
    /* Big endian */
    __evenaccess uint16_t bufsize;
    __evenaccess uint16_t size;

    #endif
    uint8_t            *buf_p;
    struct DescriptorS *next;
} descriptor_t;

/*
 * Ethernet buffer type definition.  
 */
typedef struct EtherBufferS
{
    uint8_t buffer[EMAC_NUM_BUFFERS][ETHER_CFG_BUFSIZE];

} etherbuffer_t;

typedef struct pause_resolutionS
{
    pausemask_t mask;
    pauseval_t  value;
    uint8_t     transmit;
    uint8_t     receive;
} pauseresolution_t;

typedef struct
{
    volatile struct st_etherc __evenaccess * petherc; /* ETHERC module */
    volatile struct st_edmac __evenaccess * pedmac; /* EDMAC */
    volatile uint32_t         __evenaccess * preg_pir;
    uint32_t                  phy_address;
    uint8_t                   port_connect;
} ether_control_t;

typedef struct
{
    const ether_control_t * pether_control;
    uint32_t              phy_access;
} ether_ch_control_t;

    R_PRAGMA_PACKOPTION

[関連リンク]

クローバーフィールド.jp/_pragma演算子を使ってみた。
embedded.cloverfield.jp/2016/04/12/_pragma演算子ではまりました。
infocenter.arm.com/help/topic/com.arm.doc.dui0472ij/BABDIJDD.html
cpprefjp.github.io/lang/cpp11/pragma_operator.html
Google検索: _Pragma

[補足]

gcc-renesas.comのドキュメントには記載無いがGCC本家のドキュメントの#pragma pack(1) / #pragma pack()が使えました。(実はiodefine.hでも使われていました。)

GNURX
gcc-renesas.com/migration-guides/rx/index.html#Compiler_directives

GCC本家
gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Structure_002dPacking-Pragmas.html#Structure_002dPacking-Pragmas
 

Parents
  • こんにちは。NoMaYです。

    今度は#pragma bit_orderについて考えてみました。FITのソースには以下のような記述があります。残念ながらGNURXに(というかGCC本家にも)相当する機能はありませんでした。そこで、この#pragma単体ではなく、着目するソース範囲を少し広げて、マクロを考えてみました。

    例) r_flash_rx65n.h

    現状

    #pragma bit_order left
    #pragma unpack
    typedef union
    {
        unsigned long LONG;
        struct {
            unsigned long BTFLG:1;
            unsigned long :3;
            unsigned long FAWE:12;
            unsigned long FSPR:1;
            unsigned long :3;
            unsigned long FAWS:12;
        } BIT;
    } fawreg_t;
    #pragma bit_order
    #pragma packoption

    共通化案

    R_PRAGMA_UNPACK
    typedef union
    {
        unsigned long LONG;
        R_BITFIELD_BIT_ORDER_LEFT_6(
            unsigned long BTFLG:1,
            unsigned long :3,
            unsigned long FAWE:12,
            unsigned long FSPR:1,
            unsigned long :3,
            unsigned long FAWS:12
        ) BIT;
    } fawreg_t;
    R_PRAGMA_PACKOPTION

    考えたマクロ

    #if defined(__CCRX__)


    #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)\
    }


    #elif defined(__GNUC__)

    #if defined(__RX_LITTLE_ENDIAN__)

    #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\
    struct {\
        bf6;\
        bf5;\
        bf4;\
        bf3;\
        bf2;\
        bf1;\
    }

    #else

    #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\
    struct {\
        bf1;\
        bf2;\
        bf3;\
        bf4;\
        bf5;\
        bf6;\
    }

    #endif

    #endif

    なお、#pragma bit_orderの仕様は以下の通りです。

    4.2.4 拡張仕様の使用方法 - CS+ V6.01.00 > コンパイラ編 > コンパイラ言語仕様 > 拡張言語仕様 > 拡張仕様の使用方法
    (7)ビットフィールド並び順指定
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V6.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrx04c0204y.html#53130


    ちなみに、今回の例の構造体(というかビットフィールド)の定義はiodefine.hに存在しているのですが、もっと大きな構造体の定義の一部となっており、それを利用する手段はないものかと考えてみたのですが、思い浮かびませんでした、、、

    CC-RX用iodefine.h

    #pragma bit_order left
    #pragma unpack

    typedef struct st_flash {

        union {
            unsigned long LONG;
            struct {
                unsigned long BTFLG:1;
                unsigned long :3;
                unsigned long FAWE:12;
                unsigned long FSPR:1;
                unsigned long :3;
                unsigned long FAWS:12;
            } BIT;
        } FAWMON;

    } st_flash_t;

    #pragma bit_order
    #pragma packoption

    GNURX用iodefine.h

    #pragma pack(4)

    typedef struct st_flash {

        union {
            unsigned long LONG;
            struct {
                
    #ifdef __RX_LITTLE_ENDIAN__
                unsigned long FAWS : 12;
                unsigned long  : 3;
                unsigned long FSPR : 1;
                unsigned long FAWE : 12;
                unsigned long  : 3;
                unsigned long BTFLG : 1;
    #else
                unsigned long BTFLG : 1;
                unsigned long  : 3;
                unsigned long FAWE : 12;
                unsigned long FSPR : 1;
                unsigned long  : 3;
                unsigned long FAWS : 12;
    #endif
            } BIT;
        } FAWMON;

    } st_flash_t;

    #pragma pack()

    以下、前回投稿したヘッダファイルを更新しました。

    SCFGcompiler.h

    7077.SCFGcompiler_h_20180710.txt
    #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 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 */
    

     

Reply
  • こんにちは。NoMaYです。

    今度は#pragma bit_orderについて考えてみました。FITのソースには以下のような記述があります。残念ながらGNURXに(というかGCC本家にも)相当する機能はありませんでした。そこで、この#pragma単体ではなく、着目するソース範囲を少し広げて、マクロを考えてみました。

    例) r_flash_rx65n.h

    現状

    #pragma bit_order left
    #pragma unpack
    typedef union
    {
        unsigned long LONG;
        struct {
            unsigned long BTFLG:1;
            unsigned long :3;
            unsigned long FAWE:12;
            unsigned long FSPR:1;
            unsigned long :3;
            unsigned long FAWS:12;
        } BIT;
    } fawreg_t;
    #pragma bit_order
    #pragma packoption

    共通化案

    R_PRAGMA_UNPACK
    typedef union
    {
        unsigned long LONG;
        R_BITFIELD_BIT_ORDER_LEFT_6(
            unsigned long BTFLG:1,
            unsigned long :3,
            unsigned long FAWE:12,
            unsigned long FSPR:1,
            unsigned long :3,
            unsigned long FAWS:12
        ) BIT;
    } fawreg_t;
    R_PRAGMA_PACKOPTION

    考えたマクロ

    #if defined(__CCRX__)


    #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)\
    }


    #elif defined(__GNUC__)

    #if defined(__RX_LITTLE_ENDIAN__)

    #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\
    struct {\
        bf6;\
        bf5;\
        bf4;\
        bf3;\
        bf2;\
        bf1;\
    }

    #else

    #define R_BITFIELD_BIT_ORDER_LEFT_6(bf1, bf2, bf3, bf4, bf5, bf6)\
    struct {\
        bf1;\
        bf2;\
        bf3;\
        bf4;\
        bf5;\
        bf6;\
    }

    #endif

    #endif

    なお、#pragma bit_orderの仕様は以下の通りです。

    4.2.4 拡張仕様の使用方法 - CS+ V6.01.00 > コンパイラ編 > コンパイラ言語仕様 > 拡張言語仕様 > 拡張仕様の使用方法
    (7)ビットフィールド並び順指定
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V6.01.00/CS+.chm/Compiler-CCRX.chm/Output/ccrx04c0204y.html#53130


    ちなみに、今回の例の構造体(というかビットフィールド)の定義はiodefine.hに存在しているのですが、もっと大きな構造体の定義の一部となっており、それを利用する手段はないものかと考えてみたのですが、思い浮かびませんでした、、、

    CC-RX用iodefine.h

    #pragma bit_order left
    #pragma unpack

    typedef struct st_flash {

        union {
            unsigned long LONG;
            struct {
                unsigned long BTFLG:1;
                unsigned long :3;
                unsigned long FAWE:12;
                unsigned long FSPR:1;
                unsigned long :3;
                unsigned long FAWS:12;
            } BIT;
        } FAWMON;

    } st_flash_t;

    #pragma bit_order
    #pragma packoption

    GNURX用iodefine.h

    #pragma pack(4)

    typedef struct st_flash {

        union {
            unsigned long LONG;
            struct {
                
    #ifdef __RX_LITTLE_ENDIAN__
                unsigned long FAWS : 12;
                unsigned long  : 3;
                unsigned long FSPR : 1;
                unsigned long FAWE : 12;
                unsigned long  : 3;
                unsigned long BTFLG : 1;
    #else
                unsigned long BTFLG : 1;
                unsigned long  : 3;
                unsigned long FAWE : 12;
                unsigned long FSPR : 1;
                unsigned long  : 3;
                unsigned long FAWS : 12;
    #endif
            } BIT;
        } FAWMON;

    } st_flash_t;

    #pragma pack()

    以下、前回投稿したヘッダファイルを更新しました。

    SCFGcompiler.h

    7077.SCFGcompiler_h_20180710.txt
    #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 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 */
    

     

Children
No Data