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です。

    ワーニングレベルを上げてFITモジュールをコンパイルしていて気付いたことがありました。(少なくとも)最新版では以下の未使用引数のワーニングが表示されたのですが、引数を持つインラインアセンブラ関数に対してどうにも回避のやりようがない未使用引数のワーニングが表示されてしまうというCC-RXの困惑する仕様の件はあるのですが、ワーニングの数が以前と比べてずっと多くなっていました。調べてみたところ、どうも、ヘッダ側で条件コンパイルによりCC-RXでは未使用となっている関数に対して、Cソース側では条件コンパイルが設定されていなくて未使用関数に対してワーニングが出てしまっているようです。これは修正した方が良いように思いました。(私は、とりあえず、r_rx_intrinsic_functions.cをビルドから除外するようにしました。ただ、他のCソースにおいて、どうしても出てしまうものがあって、何か対策を考えたいところです。また、怪しげなマクロになりそうですが、、、)

    Description                                         Resource                      Location    Path                                        Type
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 466    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 482    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 518    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 534    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 573    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 589    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 628    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 644    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 660    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 696    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 733    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 733    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 751    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 751    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 769    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 769    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 788    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 804    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 840    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 856    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 892    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "cos" was never referenced      r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "f" was never referenced        r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "sin" was never referenced      r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "atan2" was never referenced    r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "hypot" was never referenced    r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "x" was never referenced        r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "y" was never referenced        r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem

    ヘッダ側の例 (R_BSP_SetBPSW関数は条件コンパイル文によりICCRXでしか使用されないようになっている)

    /* ---------- Backup PSW (BPSW) ---------- */
    #if defined(__CCRX__)

    /* void set_bpsw(unsigned long data) */
    #define R_BSP_SET_BPSW(x)    set_bpsw((unsigned long)(x))
    /* unsigned long get_bpsw(void) */
    #define R_BSP_GET_BPSW()     get_bpsw()

    #elif defined(__GNUC__)

    /* void __builtin_rx_mvtc (int reg, int val) */
    #define R_BSP_SET_BPSW(x)    __builtin_rx_mvtc(0x8, (int)(x))
    /* int __builtin_rx_mvfc (int) */
    #define R_BSP_GET_BPSW()     (unsigned long)__builtin_rx_mvfc(0x8)

    #elif defined(__ICCRX__)

    /* void R_BSP_SetBPSW(uint32_t data) (This macro uses API function of BSP.) */
    #define R_BSP_SET_BPSW(x)    R_BSP_SetBPSW((uint32_t)(x))
    /* uint32_t R_BSP_GetBPSW(void) (This macro uses API function of BSP.) */
    #define R_BSP_GET_BPSW()     R_BSP_GetBPSW()

    #endif

    Cソース側の例 (R_BSP_SetBPSW関数に対して条件コンパイル文が存在していない)

    R_BSP_PRAGMA_INLINE_ASM(R_BSP_SetBPSW)
    void R_BSP_SetBPSW(uint32_t data)
    {
        R_BSP_ASM_INTERNAL_USED(data)

        R_BSP_ASM_BEGIN
        R_BSP_ASM(    MVTC    R1, BPSW    )
        R_BSP_ASM_END
    } /* End of function R_BSP_SetBPSW() */

     

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

    ワーニングレベルを上げてFITモジュールをコンパイルしていて気付いたことがありました。(少なくとも)最新版では以下の未使用引数のワーニングが表示されたのですが、引数を持つインラインアセンブラ関数に対してどうにも回避のやりようがない未使用引数のワーニングが表示されてしまうというCC-RXの困惑する仕様の件はあるのですが、ワーニングの数が以前と比べてずっと多くなっていました。調べてみたところ、どうも、ヘッダ側で条件コンパイルによりCC-RXでは未使用となっている関数に対して、Cソース側では条件コンパイルが設定されていなくて未使用関数に対してワーニングが出てしまっているようです。これは修正した方が良いように思いました。(私は、とりあえず、r_rx_intrinsic_functions.cをビルドから除外するようにしました。ただ、他のCソースにおいて、どうしても出てしまうものがあって、何か対策を考えたいところです。また、怪しげなマクロになりそうですが、、、)

    Description                                         Resource                      Location    Path                                        Type
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 466    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 482    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 518    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 534    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 573    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 589    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 628    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 644    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 660    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 696    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 733    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 733    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 751    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 751    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "bit" was never referenced      r_rx_intrinsic_functions.c    line 769    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 769    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 788    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 804    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "data" was never referenced     r_rx_intrinsic_functions.c    line 840    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 856    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "ret" was never referenced      r_rx_intrinsic_functions.c    line 892    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "cos" was never referenced      r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "f" was never referenced        r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "sin" was never referenced      r_rx_intrinsic_functions.c    line 954    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "atan2" was never referenced    r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "hypot" was never referenced    r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "x" was never referenced        r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem
    M0520826: Parameter "y" was never referenced        r_rx_intrinsic_functions.c    line 977    /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all    C/C++ Problem

    ヘッダ側の例 (R_BSP_SetBPSW関数は条件コンパイル文によりICCRXでしか使用されないようになっている)

    /* ---------- Backup PSW (BPSW) ---------- */
    #if defined(__CCRX__)

    /* void set_bpsw(unsigned long data) */
    #define R_BSP_SET_BPSW(x)    set_bpsw((unsigned long)(x))
    /* unsigned long get_bpsw(void) */
    #define R_BSP_GET_BPSW()     get_bpsw()

    #elif defined(__GNUC__)

    /* void __builtin_rx_mvtc (int reg, int val) */
    #define R_BSP_SET_BPSW(x)    __builtin_rx_mvtc(0x8, (int)(x))
    /* int __builtin_rx_mvfc (int) */
    #define R_BSP_GET_BPSW()     (unsigned long)__builtin_rx_mvfc(0x8)

    #elif defined(__ICCRX__)

    /* void R_BSP_SetBPSW(uint32_t data) (This macro uses API function of BSP.) */
    #define R_BSP_SET_BPSW(x)    R_BSP_SetBPSW((uint32_t)(x))
    /* uint32_t R_BSP_GetBPSW(void) (This macro uses API function of BSP.) */
    #define R_BSP_GET_BPSW()     R_BSP_GetBPSW()

    #endif

    Cソース側の例 (R_BSP_SetBPSW関数に対して条件コンパイル文が存在していない)

    R_BSP_PRAGMA_INLINE_ASM(R_BSP_SetBPSW)
    void R_BSP_SetBPSW(uint32_t data)
    {
        R_BSP_ASM_INTERNAL_USED(data)

        R_BSP_ASM_BEGIN
        R_BSP_ASM(    MVTC    R1, BPSW    )
        R_BSP_ASM_END
    } /* End of function R_BSP_SetBPSW() */

     

Children
No Data