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のBSPモジュールには以下のスレッドへの投稿を発展させた形でCC-RX/GNURX/ICCRX共通化割り込み関数定義マクロが組み込まれていますが、その影響で以下のFITのDTCモジュールのドキュメントに記載されているように、GNURXで未使用の変数/関数を削除するリンク最適化が出来なくなっていることを把握しました。(確かに以前に何かおかしなことがあるかもと感じたことがあった記憶はあるのですが、他のことに気を取られていて、深く追求しなかった記憶があります。) 今回、別スレッドでFreeRTOSのRTOSDemoプログラムを作成する傍ら、対策を考えてみました。(GNU ld側で対処する手もあるとは思いますが、、、) 取り敢えずの応急処置は、リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加することかと思います。ただ、関数の名前の付け方だけに頼るのはトラブルの元だと思いますので、r_rx_compiler.hのマクロを改造して併用する方法を模索中です。

    GUNRX用プロジェクトにFITモジュールを組み込む方法について
    japan.renesasrulz.com/cafe_rene/f/forum5/4860/gunrx-fit/27041#27041

    ●リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加する(他の箇所に関して思うところがあるのは別途)

    src/linker_script.ld

        .text 0xFFC00000: AT(0xFFC00000)
        {
            *(.text)
            KEEP(*(.text.*ISR))
            KEEP(*(.text.*_isr))
            KEEP(*(.text.*_interrupt))
            *(.text.*)
            *(P)
            etext = .;
        } > ROM

    RXファミリ DTCモジュール Firmware Integration Technology
    www.renesas.com/ja-jp/search/keyword-search.html#genre=document&q=r01an1819

    r01an1819jj0350-rx-dtc-dmac2.pdf

     

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

    現在、FITのBSPモジュールには以下のスレッドへの投稿を発展させた形でCC-RX/GNURX/ICCRX共通化割り込み関数定義マクロが組み込まれていますが、その影響で以下のFITのDTCモジュールのドキュメントに記載されているように、GNURXで未使用の変数/関数を削除するリンク最適化が出来なくなっていることを把握しました。(確かに以前に何かおかしなことがあるかもと感じたことがあった記憶はあるのですが、他のことに気を取られていて、深く追求しなかった記憶があります。) 今回、別スレッドでFreeRTOSのRTOSDemoプログラムを作成する傍ら、対策を考えてみました。(GNU ld側で対処する手もあるとは思いますが、、、) 取り敢えずの応急処置は、リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加することかと思います。ただ、関数の名前の付け方だけに頼るのはトラブルの元だと思いますので、r_rx_compiler.hのマクロを改造して併用する方法を模索中です。

    GUNRX用プロジェクトにFITモジュールを組み込む方法について
    japan.renesasrulz.com/cafe_rene/f/forum5/4860/gunrx-fit/27041#27041

    ●リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加する(他の箇所に関して思うところがあるのは別途)

    src/linker_script.ld

        .text 0xFFC00000: AT(0xFFC00000)
        {
            *(.text)
            KEEP(*(.text.*ISR))
            KEEP(*(.text.*_isr))
            KEEP(*(.text.*_interrupt))
            *(.text.*)
            *(P)
            etext = .;
        } > ROM

    RXファミリ DTCモジュール Firmware Integration Technology
    www.renesas.com/ja-jp/search/keyword-search.html#genre=document&q=r01an1819

    r01an1819jj0350-rx-dtc-dmac2.pdf

     

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

    すみません、そういえば、私は以下の案件をすっかり放置してしまっていました。週末、思い出してみます。(1年以上前の案件ですね、、、)

    現在、FITのBSPモジュールには以下のスレッドへの投稿を発展させた形でCC-RX/GNURX/ICCRX共通化割り込み関数定義マクロが組み込まれていますが、その影響で以下のFITのDTCモジュールのドキュメントに記載されているように、GNURXで未使用の変数/関数を削除するリンク最適化が出来なくなっていることを把握しました。(確かに以前に何かおかしなことがあるかもと感じたことがあった記憶はあるのですが、他のことに気を取られていて、深く追求しなかった記憶があります。) 今回、別スレッドでFreeRTOSのRTOSDemoプログラムを作成する傍ら、対策を考えてみました。(GNU ld側で対処する手もあるとは思いますが、、、) 取り敢えずの応急処置は、リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加することかと思います。ただ、関数の名前の付け方だけに頼るのはトラブルの元だと思いますので、r_rx_compiler.hのマクロを改造して併用する方法を模索中です。

    GUNRX用プロジェクトにFITモジュールを組み込む方法について
    japan.renesasrulz.com/cafe_rene/f/forum5/4860/gunrx-fit/27041#27041

    ●リンカスクリプトlinker_script.ldに以下の赤文字箇所を追加する(他の箇所に関して思うところがあるのは別途)

    src/linker_script.ld

        .text 0xFFC00000: AT(0xFFC00000)
        {
            *(.text)
            KEEP(*(.text.*ISR))
            KEEP(*(.text.*_isr))
            KEEP(*(.text.*_interrupt))
            *(.text.*)
            *(P)
            etext = .;
        } > ROM

    RXファミリ DTCモジュール Firmware Integration Technology
    www.renesas.com/ja-jp/search/keyword-search.html#genre=document&q=r01an1819

    r01an1819jj0350-rx-dtc-dmac2.pdf