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

    今度はIAR C/C++コンパイラのユーザーズマニュアルを調べてみました。ここまでのところのCC-RXの#pragmaに相当する機能はありました。ただし、変数のセクションの変更に関しては特別な点(以下の表の赤文字)があり、恐らく、セクションの変更に関してはマクロを関数用と変数用の2つのマクロに分ける必要がありそうでした。加えて、関数のセクションの変更に関しては不明な点(同じく以下の表の赤文字)があって、少し気掛かりです。(それでも、試しに後で、今回作成しているヘッダファイルに組み込んでみようかと思います。とは言っても、IAR C/C++コンパイラはインストールしていませんので、ドキュメントだけに頼ったものになりますが、、、)

    C/C++ Development Guide for the Renesas RX Family (どうもFTPサーバーが重いようです)
    ftp.iar.se/WWWfiles/RX/webic/doc/EWRX_DevelopmentGuide.ENU.pdf

    CC-RX  ICCRX (365頁 - C/C++ Development Guide)
    #pragma pack  #pragma pack(1)
    #pragma unpack   #pragma pack(4)
    #pragma pack           #pragma pack()

     

    CC-RX ICCRX (372頁 - C/C++ Development Guide)
    #pragma interrupt FUNCTION_NAME(vect=VECTOR) #pragma vector=VECTOR
    __interrupt void FUNCTION_NAME(void);
    #pragma interrupt FUNCTION_NAME(fint) __fast_interrupt void FUNCTION_NAME(void);

     

    CC-RX ICCRX (354頁 - C/C++ Development Guide)
    #pragma bit_order left #pragma bitfield=reversed_disjoint_types
    #pragma bit_order right #pragma bitfield=disjoint_types
    #pragma bit_order #pragma bitfield=default

     

    CC-RX ICCRX (362頁 - C/C++ Development Guide)
    #pragma section NAME #pragma location="NAME"
    __no_init 変数定義(__no_initというキーワードが必要!)
    #pragma location="NAME"
    関数宣言 (関数定義は?)


    [関連リンク]

    Migration guide from Renesas HEW or e2 studio (どうもFTPサーバーが重いようです)
    ftp.iar.se/WWWfiles/RX/webic/doc/EWRX_MigratingFromRenesas.pdf

    Project migration tools
    www.iar.com/jp/iar-embedded-workbench/project-migration/

    User Guides: IAR Embedded Workbench for Renesas RX
    www.iar.com/support/user-guides/user-guides-iar-embedded-workbench-for-renesas-rx/
     

  • NoMaYさん

    こんにちは、シェルティです。

    いつも貴重な情報ありがとうございます。

    次の3連休に調査いただいた情報をえいやでAmazon FreeRTOSに適用して
    GCCで動くところまで持っていきたいと考えています。
    IARのRXマイコン用のコンパイラも仕入れてきたので、できれば1コード3コンパイラ対応を目指します。
    こちらでは大きな方針を考えて、細かい調整や検証は休み明けに協力会社に実施いただく算段です。

    いつも本当にありがとうございます。

    以上です
  • シェルティさん、こんにちは。NoMaYです。

    次の3連休というと明日からですね。文面から察するところ、作業中ではありますが、私の手元にあるAmazon FreeRTOSのRenesas RXのGNURXの.projectとか.cprojectとか小細工ソースとかFITソースの修正箇所情報とか、commitしておいた方が良さそうですね。今日もう少し作業を進めて、深夜にcommitしておこうかと思います。(もし寝落ちしたら、明日の朝に。^_^;)

  • NoMaYさん

    シェルティです、こんにちは。

    あっ!? 明日から休みでした。言われて気付きました。
    はい、明日から色々試してみようと思っています。
    commitについて、ご連絡ありがとうございます。大変助かります。

    GitHubの renesas-rx の organizationもそろそろ動かそうかなと思うので、
    機を見てNoMaYさんにメンバー申請送っておきます。
    コミュニティと協力して開発できるようなルールにしました。

    以上です
Reply
  • NoMaYさん

    シェルティです、こんにちは。

    あっ!? 明日から休みでした。言われて気付きました。
    はい、明日から色々試してみようと思っています。
    commitについて、ご連絡ありがとうございます。大変助かります。

    GitHubの renesas-rx の organizationもそろそろ動かそうかなと思うので、
    機を見てNoMaYさんにメンバー申請送っておきます。
    コミュニティと協力して開発できるようなルールにしました。

    以上です
Children
No Data