こんにちは。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です。くだんのCGコンポーネントの割り込み関数に関しては以下のように KEEP(*(.text.*Interrupt)) を追加すれば対処することが出来ます。なお、FreeRTOSのカーネルとデモプログラムへ対処したのが KEEP(*(.text.*ISR)) だったのですけれども、Azure RTOSのカーネルはどうなのか気になって確認してみました。以下のスレッドにCC-RXの場合について投稿していたソースと同じ様に、GNURXの場合もAzure RTOSのカーネルの割り込み関数のソースはアセンブラ記述になっていて、そのセクション名は .text となっていまして、現状では、FreeRTOSのカーネルやFIT/CGとは同じ様には扱えないことが分かりました。つまり、ソースにパッチを当ててセクション名を変更して同じ応急処置方法に嵌め込む、ようにする必要がありそうです。(なので、現状では、そのままのAzure RTOSカーネルソースでGNURXを使用するのならば、やはり -gc-section を諦めないといけない、ということになりそうです。(現状の回避策のまま。))Azure RTOSカーネルのCC-RXの場合の割り込み関数Azure RTOSでRXマイコンが使えるようになったのですねcommunity-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6995/azure-rtos-rx/46908#46908「libs/threadx/ports/rxv3/ccrx/src/tx_thread_schedule.src (こちらは割り込みルーチンです)
; Software triggered interrupt used to perform context switches.; The priority of this interrupt is set to the lowest priority within; tx_initialize_low_level() and triggered by ThreadX when calling; _tx_thread_system_return()..RVECTOR 27, _tx_software_interrupt_entry.GLB _tx_software_interrupt_entry_tx_software_interrupt_entry: PUSHM R1-R2 BSR __tx_thread_context_save BRA __tx_thread_context_restore
」Azure RTOSカーネルのGNURXの場合の割り込み関数lib/threadx/ports/rxv3/gnu/src/tx_thread_schedule.S (現状のソースです)(該当箇所のセクション名を .text.tx_software_interrupt_entry にして応急処置する?)
... 途中省略 ... .text... 途中省略 ...; Software triggered interrupt used to perform context switches.; The priority of this interrupt is set to the lowest priority within; tx_initialize_low_level() and triggered by ThreadX when calling; _tx_thread_system_return()..global $tableentry$27$.rvectors$tableentry$27$.rvectors: PUSHM R1-R2 BSR __tx_thread_context_save BRA __tx_thread_context_restore... 途中省略 ...
Azure RTOS以外の場合(FreeRTOSもしくはRTOS未使用)の場合の応急処置src/linker_script.ld
.text 0xFFC00000: AT(0xFFC00000) { *(.text) KEEP(*(.text.*_isr)) /* for FIT */ KEEP(*(.text.*_interrupt)) /* for CG */ KEEP(*(.text.*Interrupt)) /* for CG Motor Component */ KEEP(*(.text.*ISR)) /* for FreeRTOS Kernel and Demos */ *(.text.*) *(P) etext = .; } > ROM