こんにちは。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_PACKtypedef 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.htmlcpprefjp.github.io/lang/cpp11/pragma_operator.htmlGoogle検索: _Pragma[補足]gcc-renesas.comのドキュメントには記載無いがGCC本家のドキュメントの#pragma pack(1) / #pragma pack()が使えました。(実はiodefine.hでも使われていました。)GNURXgcc-renesas.com/migration-guides/rx/index.html#Compiler_directivesGCC本家gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Structure_002dPacking-Pragmas.html#Structure_002dPacking-Pragmas
こんにちは。NoMaYです。ワーニングレベルを上げてFITモジュールをコンパイルしていて気付いたことがありました。(少なくとも)最新版では以下の未使用引数のワーニングが表示されたのですが、引数を持つインラインアセンブラ関数に対してどうにも回避のやりようがない未使用引数のワーニングが表示されてしまうというCC-RXの困惑する仕様の件はあるのですが、ワーニングの数が以前と比べてずっと多くなっていました。調べてみたところ、どうも、ヘッダ側で条件コンパイルによりCC-RXでは未使用となっている関数に対して、Cソース側では条件コンパイルが設定されていなくて未使用関数に対してワーニングが出てしまっているようです。これは修正した方が良いように思いました。(私は、とりあえず、r_rx_intrinsic_functions.cをビルドから除外するようにしました。ただ、他のCソースにおいて、どうしても出てしまうものがあって、何か対策を考えたいところです。また、怪しげなマクロになりそうですが、、、)
Description Resource Location Path TypeM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 466 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 482 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 518 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 534 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 573 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 589 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 628 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 644 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 660 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 696 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "bit" was never referenced r_rx_intrinsic_functions.c line 733 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 733 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "bit" was never referenced r_rx_intrinsic_functions.c line 751 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 751 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "bit" was never referenced r_rx_intrinsic_functions.c line 769 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 769 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 788 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 804 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "data" was never referenced r_rx_intrinsic_functions.c line 840 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 856 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "ret" was never referenced r_rx_intrinsic_functions.c line 892 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "cos" was never referenced r_rx_intrinsic_functions.c line 954 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "f" was never referenced r_rx_intrinsic_functions.c line 954 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "sin" was never referenced r_rx_intrinsic_functions.c line 954 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "atan2" was never referenced r_rx_intrinsic_functions.c line 977 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "hypot" was never referenced r_rx_intrinsic_functions.c line 977 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: Parameter "x" was never referenced r_rx_intrinsic_functions.c line 977 /RTOSDemo_CCRX/src/smc_gen/r_bsp/mcu/all C/C++ ProblemM0520826: 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() */