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

    くだんの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

     

Reply
  • こんにちは。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

     

Children
No Data