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 sectionについて考えてみました。FITのソースには以下のような記述があります。幸いなことにGNURXにも(というかGCC本家にも)相当する機能があります。とは言え、CC-RXとの構文の違いをどのようにラップしてソースの共通化に使えるマクロにするか悩ましいところがありましたが、以下のマクロを考えてみました。

    例1) r_ether_rx.c

    現状

    /*
     * Receive, transmit descriptors and their buffer.  They are
     * defined with section pragma directives to easily locate them
     * on the memory map.
     */
    #pragma section _RX_DESC
    static descriptor_t rx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_RX_DESCRIPTORS];
    #pragma section _TX_DESC
    static descriptor_t tx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_TX_DESCRIPTORS];

    /*
     * As for Ethernet buffer, the size of total buffer which are use for transmission and the reception is secured.
     * The total buffer's size which the value is integrated from  EMAC_NUM_BUFFERS (buffer number) and
     * ETHER_CFG_BUFSIZE (the size of one buffer).
     * The ETHER_CFG_BUFSIZE and EMAC_NUM_BUFFERS are defined by macro in the file "r_ether_private.h".
     * It is sequentially used from the head of the buffer as a receive buffer or a transmission buffer.
     */
    #pragma section _ETHERNET_BUFFERS
    static etherbuffer_t ether_buffers[ETHER_CHANNEL_MAX];

    #pragma section

    共通化案

    /*
     * Receive, transmit descriptors and their buffer.  They are
     * defined with section pragma directives to easily locate them
     * on the memory map.
     */
    R_ATTRIB_SECTION_CHANGE(_RX_DESC)
    static descriptor_t rx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_RX_DESCRIPTORS];
    R_ATTRIB_SECTION_CHANGE(_TX_DESC)
    static descriptor_t tx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_TX_DESCRIPTORS];

    /*
     * As for Ethernet buffer, the size of total buffer which are use for transmission and the reception is secured.
     * The total buffer's size which the value is integrated from  EMAC_NUM_BUFFERS (buffer number) and
     * ETHER_CFG_BUFSIZE (the size of one buffer).
     * The ETHER_CFG_BUFSIZE and EMAC_NUM_BUFFERS are defined by macro in the file "r_ether_private.h".
     * It is sequentially used from the head of the buffer as a receive buffer or a transmission buffer.
     */
    R_ATTRIB_SECTION_CHANGE(_ETHERNET_BUFFERS)
    static etherbuffer_t ether_buffers[ETHER_CHANNEL_MAX];

    R_ATTRIB_SECTION_CHANGE_END

    例2) r_flash_type4.c

    現状

    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    static flash_err_t flash_write_faw_reg(fawreg_t faw);

    #if (FLASH_IN_DUAL_BANK_MODE)
    #pragma section FRAM2

    flash_err_t flash_toggle_banksel_reg()
    {
        略
    }

    #endif // FLASH_IN_DUAL_BANK_MODE

    #pragma section FRAM
    #endif // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    flash_err_t get_cmdlk_err(void)
    {
        略
    }



    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)



    flash_err_t flash_write_faw_reg (fawreg_t   faw)
    {
        略
    }



    #pragma section // end FRAM
    #endif // FLASH_CFG_CODE_FLASH_ENABLE

    共通化案

    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    static flash_err_t flash_write_faw_reg(fawreg_t faw);

    #if (FLASH_IN_DUAL_BANK_MODE)

    R_ATTRIB_SECTION_CHANGE(FRAM2)
    flash_err_t flash_toggle_banksel_reg()
    {
        略
    }

    #endif // FLASH_IN_DUAL_BANK_MODE

    #define FLASH_PE_MODE_SECTION    R_ATTRIB_SECTION_CHANGE(FRAM)
    #define FLASH_SECTION_CHANGE_END R_ATTRIB_SECTION_CHANGE_END

    #else // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    #define FLASH_PE_MODE_SECTION
    #define FLASH_SECTION_CHANGE_END

    #endif // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    FLASH_PE_MODE_SECTION
    flash_err_t get_cmdlk_err(void)
    {
        略
    }



    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)



    FLASH_PE_MODE_SECTION
    flash_err_t flash_write_faw_reg (fawreg_t   faw)
    {
        略
    }



    FLASH_SECTION_CHANGE_END // end FRAM

    #endif // FLASH_CFG_CODE_FLASH_ENABLE

    考えたマクロ

    #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

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

    SCFGcompiler.h

    4130.SCFGcompiler_h_20180711.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 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 */
    

     

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

    今度は#pragma sectionについて考えてみました。FITのソースには以下のような記述があります。幸いなことにGNURXにも(というかGCC本家にも)相当する機能があります。とは言え、CC-RXとの構文の違いをどのようにラップしてソースの共通化に使えるマクロにするか悩ましいところがありましたが、以下のマクロを考えてみました。

    例1) r_ether_rx.c

    現状

    /*
     * Receive, transmit descriptors and their buffer.  They are
     * defined with section pragma directives to easily locate them
     * on the memory map.
     */
    #pragma section _RX_DESC
    static descriptor_t rx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_RX_DESCRIPTORS];
    #pragma section _TX_DESC
    static descriptor_t tx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_TX_DESCRIPTORS];

    /*
     * As for Ethernet buffer, the size of total buffer which are use for transmission and the reception is secured.
     * The total buffer's size which the value is integrated from  EMAC_NUM_BUFFERS (buffer number) and
     * ETHER_CFG_BUFSIZE (the size of one buffer).
     * The ETHER_CFG_BUFSIZE and EMAC_NUM_BUFFERS are defined by macro in the file "r_ether_private.h".
     * It is sequentially used from the head of the buffer as a receive buffer or a transmission buffer.
     */
    #pragma section _ETHERNET_BUFFERS
    static etherbuffer_t ether_buffers[ETHER_CHANNEL_MAX];

    #pragma section

    共通化案

    /*
     * Receive, transmit descriptors and their buffer.  They are
     * defined with section pragma directives to easily locate them
     * on the memory map.
     */
    R_ATTRIB_SECTION_CHANGE(_RX_DESC)
    static descriptor_t rx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_RX_DESCRIPTORS];
    R_ATTRIB_SECTION_CHANGE(_TX_DESC)
    static descriptor_t tx_descriptors[ETHER_CHANNEL_MAX][ETHER_CFG_EMAC_TX_DESCRIPTORS];

    /*
     * As for Ethernet buffer, the size of total buffer which are use for transmission and the reception is secured.
     * The total buffer's size which the value is integrated from  EMAC_NUM_BUFFERS (buffer number) and
     * ETHER_CFG_BUFSIZE (the size of one buffer).
     * The ETHER_CFG_BUFSIZE and EMAC_NUM_BUFFERS are defined by macro in the file "r_ether_private.h".
     * It is sequentially used from the head of the buffer as a receive buffer or a transmission buffer.
     */
    R_ATTRIB_SECTION_CHANGE(_ETHERNET_BUFFERS)
    static etherbuffer_t ether_buffers[ETHER_CHANNEL_MAX];

    R_ATTRIB_SECTION_CHANGE_END

    例2) r_flash_type4.c

    現状

    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    static flash_err_t flash_write_faw_reg(fawreg_t faw);

    #if (FLASH_IN_DUAL_BANK_MODE)
    #pragma section FRAM2

    flash_err_t flash_toggle_banksel_reg()
    {
        略
    }

    #endif // FLASH_IN_DUAL_BANK_MODE

    #pragma section FRAM
    #endif // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    flash_err_t get_cmdlk_err(void)
    {
        略
    }



    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)



    flash_err_t flash_write_faw_reg (fawreg_t   faw)
    {
        略
    }



    #pragma section // end FRAM
    #endif // FLASH_CFG_CODE_FLASH_ENABLE

    共通化案

    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    static flash_err_t flash_write_faw_reg(fawreg_t faw);

    #if (FLASH_IN_DUAL_BANK_MODE)

    R_ATTRIB_SECTION_CHANGE(FRAM2)
    flash_err_t flash_toggle_banksel_reg()
    {
        略
    }

    #endif // FLASH_IN_DUAL_BANK_MODE

    #define FLASH_PE_MODE_SECTION    R_ATTRIB_SECTION_CHANGE(FRAM)
    #define FLASH_SECTION_CHANGE_END R_ATTRIB_SECTION_CHANGE_END

    #else // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    #define FLASH_PE_MODE_SECTION
    #define FLASH_SECTION_CHANGE_END

    #endif // #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)

    FLASH_PE_MODE_SECTION
    flash_err_t get_cmdlk_err(void)
    {
        略
    }



    #if (FLASH_CFG_CODE_FLASH_ENABLE == 1)



    FLASH_PE_MODE_SECTION
    flash_err_t flash_write_faw_reg (fawreg_t   faw)
    {
        略
    }



    FLASH_SECTION_CHANGE_END // end FRAM

    #endif // FLASH_CFG_CODE_FLASH_ENABLE

    考えたマクロ

    #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

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

    SCFGcompiler.h

    4130.SCFGcompiler_h_20180711.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 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 */
    

     

Children
No Data