TB-RX65N/TB-RX231/TB-RX130+CC-RX/GNURXでCoreMark®ベンチマークを動かせるようにしてみようと思います

こんにちは。NoMaYです。#2連投の1つ目です。

ルネサスさんのアプリケーションノートに以下の『RX100シリーズ RX100上でCoreMarkを実行する方法』というRSK-RX111+IAR EW統合開発環境でEEMBCのCoreMarkベンチマークを実行するものがあったのですが、これをRX-TB 3種類+CC-RX/GNURXへ移植してみようと思います。まず、手始めにTB-RX130+CC-RX+CS+で試してみました。(後日、他のTBボードやGNURXでも動かしてみようと思います。さらに、e2 studioでも動かせるようにしてみようと思います。なお、その時は、GitHub上でEEMBCが公開しているCoreMarkベンチマークの以下のリポジトリのソースに差し替え、かつ、RXスマートコンフィグレータが生成したソースを出来るだけ使うような作りに変更しよう、と思っています。)

プロジェクトのファイル一式
tb_rx130_coremark_ccrx_c_csplus_20191026.zip    384KB

アプリケーションノート: RX100シリーズ RX100上でCoreMarkを実行する方法
www.renesas.com/jp/ja/search?keywords=CoreMark&f[0]=content_type:document

ドキュメント
www.renesas.com/jp/ja/document/apn/rx100-series-running-coremark-rx100

サンプルプログラム
www.renesas.com/jp/ja/document/scd/rx100-series-running-coremark-rx100

GitHub上でEEMBCが公開しているCoreMarkベンチマークのソース
github.com/eembc/coremark


TB-RX130+CC-RX V2.03で試した結果と試した時のCC-RXの最適化オプションは、以下の画面コピーの通りです。得られたCoreMark値が91.5、動作周波数が32MHz、よって、CoreMark/MHzは2.86、となりました。(ちなみに、CoreMark値やCoreMark/MHzは、そもそもそういうものなのですが、最適化オプションによりかなり値が変わります。) なお、以下の画面コピーの通り、RSK-RX111+EWRX V2.41.1でのCoreMark/MHzは3.073のようでした。また、ルネサスさんの製品ページでのRX130(やRX111)のCoreMark/MHzは3.08です。




Parents
  • こんにちは。NoMaYです。#3連投の2つ目です。

    プロジェクト構造とCC-RX/GNURXの最適化オプション設定は以下の画面コピーの通りです。

    CC-RX+CS+の場合



    CC-RX+e2 studioの場合



    GNURX+e2 studioの場合



    GitHub上でEEMBCが公開しているCoreMarkベンチマークのソースからの変更箇所は以下の画面コピーの通りです。なお、リポジトリと今回使用したソースのURLは以下の通りです。

    リポジトリ
    github.com/eembc/coremark

    今回使用したソース
    github.com/eembc/coremark/tree/21d473aae1

    変更したソースと変更箇所






    RXスマートコンフィグレータが生成したソースのStart user code~End user code内に追加したコードは以下の通りです。また、これらの中で、CoreMarkベンチマークのソースのportmeソースとインターフェイスする為の関数はtimer_gettick()とserial_charput()の2つ(赤文字箇所)です。

    src/smc_gen/Config_MTU2/Config_MTU2.h

    /* Start user code for function. Do not edit comment generated here */
    unsigned long timer_gettick(void);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_MTU2/Config_MTU2.c

    /* Start user code for adding. Do not edit comment generated here */

    unsigned long timer_gettick(void)
    {
        unsigned long cycles;

        /* Stop the lower 16-bit counter (it makes also the upper 16-bit counter stop) */
        R_Config_MTU2_Stop();

        /* Combine two 16-bit counters to form 32-bit counter value */
        cycles =  ((unsigned long)(MTU2.TCNT) &  0xffff);
        cycles |= ((unsigned long)(MTU1.TCNT) << 16);

        /* Resume the lower 16-bit counter (it makes also the upper 16-bit counter resume) */
        R_Config_MTU2_Start();

        return cycles;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1.h

    /* Start user code for function. Do not edit comment generated here */
    void serial_charput(char output_char);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_SCI1/Config_SCI1.c

    /* Start user code for global. Do not edit comment generated here */
    volatile bool g_SCI1_tx_ready_flag = false;           /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void serial_charput(char output_char)
    {
        R_Config_SCI1_Serial_Send((uint8_t *)&output_char, 1);
        do {} while (false == g_SCI1_tx_ready_flag);
        g_SCI1_tx_ready_flag = false;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1_user.c

    /* Start user code for global. Do not edit comment generated here */
    extern volatile bool g_SCI1_tx_ready_flag;                   /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    static void r_Config_SCI1_callback_transmitend(void)
    {
        /* Start user code for r_Config_SCI1_callback_transmitend. Do not edit comment generated here */
        g_SCI1_tx_ready_flag = true;
        /* End user code. Do not edit comment generated here */
    }

    src/smc_gen/general/r_cg_hardware_setup.c

    /* Start user code for global. Do not edit comment generated here */

    /* Workaround to execute additional initialization */
    void R_Systeminit1(void);
    void R_Systeminit2(void);
    void R_Systeminit(void)
    {
        R_Systeminit1();
        R_Systeminit2();
    }
    #define R_Systeminit R_Systeminit1

    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void R_Systeminit2(void)
    {
        /* Do not call any functions which enables generating any interrupt requests. */
        R_Config_SCI1_Start();
        R_Config_MTU1_Start();
        R_Config_MTU2_Start();
    }

    /* End user code. Do not edit comment generated here */   

     

Reply
  • こんにちは。NoMaYです。#3連投の2つ目です。

    プロジェクト構造とCC-RX/GNURXの最適化オプション設定は以下の画面コピーの通りです。

    CC-RX+CS+の場合



    CC-RX+e2 studioの場合



    GNURX+e2 studioの場合



    GitHub上でEEMBCが公開しているCoreMarkベンチマークのソースからの変更箇所は以下の画面コピーの通りです。なお、リポジトリと今回使用したソースのURLは以下の通りです。

    リポジトリ
    github.com/eembc/coremark

    今回使用したソース
    github.com/eembc/coremark/tree/21d473aae1

    変更したソースと変更箇所






    RXスマートコンフィグレータが生成したソースのStart user code~End user code内に追加したコードは以下の通りです。また、これらの中で、CoreMarkベンチマークのソースのportmeソースとインターフェイスする為の関数はtimer_gettick()とserial_charput()の2つ(赤文字箇所)です。

    src/smc_gen/Config_MTU2/Config_MTU2.h

    /* Start user code for function. Do not edit comment generated here */
    unsigned long timer_gettick(void);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_MTU2/Config_MTU2.c

    /* Start user code for adding. Do not edit comment generated here */

    unsigned long timer_gettick(void)
    {
        unsigned long cycles;

        /* Stop the lower 16-bit counter (it makes also the upper 16-bit counter stop) */
        R_Config_MTU2_Stop();

        /* Combine two 16-bit counters to form 32-bit counter value */
        cycles =  ((unsigned long)(MTU2.TCNT) &  0xffff);
        cycles |= ((unsigned long)(MTU1.TCNT) << 16);

        /* Resume the lower 16-bit counter (it makes also the upper 16-bit counter resume) */
        R_Config_MTU2_Start();

        return cycles;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1.h

    /* Start user code for function. Do not edit comment generated here */
    void serial_charput(char output_char);
    /* End user code. Do not edit comment generated here */

    src/smc_gen/Config_SCI1/Config_SCI1.c

    /* Start user code for global. Do not edit comment generated here */
    volatile bool g_SCI1_tx_ready_flag = false;           /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void serial_charput(char output_char)
    {
        R_Config_SCI1_Serial_Send((uint8_t *)&output_char, 1);
        do {} while (false == g_SCI1_tx_ready_flag);
        g_SCI1_tx_ready_flag = false;
    }

    /* End user code. Do not edit comment generated here */   

    src/smc_gen/Config_SCI1/Config_SCI1_user.c

    /* Start user code for global. Do not edit comment generated here */
    extern volatile bool g_SCI1_tx_ready_flag;                   /* SCI1 transmit end flag */
    /* End user code. Do not edit comment generated here */
    static void r_Config_SCI1_callback_transmitend(void)
    {
        /* Start user code for r_Config_SCI1_callback_transmitend. Do not edit comment generated here */
        g_SCI1_tx_ready_flag = true;
        /* End user code. Do not edit comment generated here */
    }

    src/smc_gen/general/r_cg_hardware_setup.c

    /* Start user code for global. Do not edit comment generated here */

    /* Workaround to execute additional initialization */
    void R_Systeminit1(void);
    void R_Systeminit2(void);
    void R_Systeminit(void)
    {
        R_Systeminit1();
        R_Systeminit2();
    }
    #define R_Systeminit R_Systeminit1

    /* End user code. Do not edit comment generated here */
    /* Start user code for adding. Do not edit comment generated here */

    void R_Systeminit2(void)
    {
        /* Do not call any functions which enables generating any interrupt requests. */
        R_Config_SCI1_Start();
        R_Config_MTU1_Start();
        R_Config_MTU2_Start();
    }

    /* End user code. Do not edit comment generated here */   

     

Children
No Data