e2 studio+GNURXでFreeRTOSプロジェクトもどきSample Programを作ってRenesas RX Simulator/TB-RX65Nで試せるようにしてみた

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

別スレッド『e2 studio v7.5.0のFreeRTOS ProjectでVisual Expression+Renesas RX Simulator/TB-RX65Nで試せるSample Programを作ってみた』や『CSplusでFreeRTOSプロジェクトもどきSample Programを作ってRenesas RX Simulator/TB-RX65Nで試せるようにしてみた』のCC-RXサンプルプログラムをe2 studio v7.6.0+GNURXで試せるようにしてみました。(ちなみに、今のところ、e2 studioのRXスマートコンフィグレータプラグインであってもGNURXではFreeRTOS KernelコンポーネントやFreeRTOS Objectコンポーネントを設定する機能が使用出来ませんので、手作業でソースファイルを編集することになります。)

TB-RX65N用 (以下はe2 studio+CC-RXの時と同じです)

(1) TBボードのLED0を500ms毎にOn/Offする(FreeRTOS APIのvTaskDelay()を使用)
(2) TBボードのSW1押下毎にLED1をOn/Offする(タスクでセマフォ待ちして割り込みでセマフォ待ち解除)
(3) TBボードのSCI1で3文字受信毎に3文字エコーバックする(タスクでセマフォ待ちして割り込みで3文字毎にセマフォ待ち解除)

Renesas RX Simulator用 (以下はe2 studio+CC-RXの時と同じです)

(1') Visual ExpressionのLED部品を50ms(但しシミュレーション上の時間)毎にOn/Offする(上の(1)の括弧内と同様)
(2') Visual ExpressionのBUTTON部品押下毎にLED部品をOn/Offする(上の(2)の括弧内と同様)
(3') Renesas Debug Virtual Console⇔SCI1で3文字受信毎に3文字エコーバックする(上の(3)の括弧内と同様)

プロジェクトのファイル一式 (GNURX 2019q2(4.8.4.201902)でビルド、zipファイルをe2 studioに直接インポート可能))
japan.renesasrulz.com/cafe_rene/m/sample_program/436
sim_rx65n_scfg_freertos_fit_gnurx_c_e2v760_20191019.zip    1.02MB

含まれるプロジェクト
sim_rx65n_scfg_freertos_fit ← こちら側にソースがあります(TB-RX65Nでも動作可)(*1,*2)
tb_rx65n_scfg_freertos_fit ← こちら側にソースは無いです(TB側はSIM側のソースフォルダをリンク機能で参照します)(*1,*2)
x_DO_NOT_BUILD_rx65n_scfg_freertos_fit_0 ← ソース編集前のRXスマートコンフィグレータ設定直後のソース(*3)

*1:以前に別スレッド『RenesasさんからRXマイコンの低価格Target Boardが出たのでサンプルプログラムをCSplus projectへ変換してみようと思います』に投稿したプロジェクトと同じIDコードを設定しています。

*2:実機用の.launchファイルは当方特有の事情でオンボードエミュレータが使えない為に未確認です。

*3:RXスマートコンフィグレータの設定を行った直後にRXスマートコンフィグレータに生成させたソースがx_DO_NOT_BUILD_rx65n_scfg_freertos_fit_0プロジェクトのsrcフォルダのソースです。ファイル比較ツールで比較することで、RXスマートコンフィグレータに生成させた後、どのように編集したか分かります。

今回、コーディング上の小技として以下のことをやってみました。(なお、(J)はCC-RX版へも反映させました。)

(J) C言語拡張キーワード__evenaccess(CC-RX)/__sfr(ICCRX)/無し(GNURX)の差異を吸収するVOLATILEという#defineを用意
(K) リンカスクリプト内でインクルードされているリンカスクリプトのインクルードパスをリンカオプション-Lで指定

あと、GNURXのコンパイラ設定/リンカ設定で以下を指定するようにしました。

(L) スタック情報生成の為に-fstack-usage -fdump-rtl-pro_and_epilogueを指定
(M) C言語標準ライブラリとしてnewlib-nano pre-buildを指定(ですが現状未使用かも知れません)

また、以下のスレッドへ投稿した話題を取り込んでみました。

RX SmartConfiguratorのGNURX向け生成コードのBugではないかと思われる動作について
japan.renesasrulz.com/cafe_rene/f/forum5/5753/rx-smartconfigurator-gnurx-bug/33189#33189
→ vecttbl.cとlinker_script.ldのバグ回避策案と改善事項を取り込みました

GNURX用のCCRXmachine.hとCCRXmachine.cというソースがe2 studioフォルダにありました(内容は概ね名前から予想される通りのものでした)
japan.renesasrulz.com/cafe_rene/f/forum5/5046/gnurx-ccrxmachine-h-ccrxmachine-c-e2-studio/33256#33256
→ BSPモジュールのr_rx_intrinsic_functions.h/.cの関数名をCC-RXと同一にするmachine.hを取り込みました

なお、以下のスレッドへ投稿した話題は取り込んでいません。

GNURX用のCCRXmachine.hとCCRXmachine.cというソースがe2 studioフォルダにありました(内容は概ね名前から予想される通りのものでした)
japan.renesasrulz.com/cafe_rene/f/forum5/5046/gnurx-ccrxmachine-h-ccrxmachine-c-e2-studio/33316#33316
→ BSPモジュールのr_rx_intrinsic_functions.cのGNURX版での不具合に関しては今回は何もせず

この後、2投目、3投目は以下の通りです。

2投目
・コーディングの小技の説明
・コンパイラ設定/リンカ設定の画面コピー

3投目
・CC-RX版とGNURX版で相違のあるソースファイルの一覧と相違点の画面コピー

以下、画面コピーと写真です。 (写真はCC-RXの時のものと同じです)(画面コピーも殆ど同じ/全く同じです。)

Renesas RX Simulatorで実行


TB-RX65Nで実行



CC-RX版とGNURX版で相違のあるソースファイル

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

    以下、コーディングの小技とコンパイラ設定/リンカ設定の説明です。なお、プロジェクトの全体構成は以下の画面コピーの通りです。



    (J) C言語拡張キーワード__evenaccess(CC-RX)/__sfr(ICCRX)/無し(GNURX)の差異を吸収するVOLATILEという#defineを用意

    CC-RXの__evenaccessキーワードについては、以下のスレッドを投稿したことがありますが、良く分からないまま長いこと放置してしまっています。ただ、IAR C/C++コンパイラにも同様のキーワード__sfrがあったり、GNURXではそういうキーワードが無かったり、といった差異がありますので、今回、以下の#defineを追加してみました。(私は、競合メーカーの「RXマイコンを使うべきではない5つの理由」みたいなマーケティング資料のネタにされそうな、このCC-RXの__evenaccessキーワードは不要になれば良いのになぁ、と思っていますが。(あとIAR C/C++コンパイラの__sfrも。))

    CC-RXでvolatile指定有り__evenaccess指定無しのobjectへのaccess sizeが保証されないのは言語規格上妥当なのかな?
    japan.renesasrulz.com/cafe_rene/f/forum5/5094/cc-rx-volatile-__evenaccess-object-access-size/30706#30706

    src/smc_gen/r_config/r_bsp_config.h

    /* For convenience to port programs from CC-RX to GNURX or ICCRX.
     */
    #define VOLATILE volatile R_BSP_EVENACCESS_SFR
    #if !defined(__CCRX__)
    #include "r_bsp_modified/GNURX_support/machine.h"
    #endif

    なお、R_BSP_EVENACCESS_SFRは以下のようにBSPモジュールで定義されているものです。

    src/smc_gen/r_bsp/mcu/all/r_compiler.h

    #if defined(__CCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile __evenaccess
    #define R_BSP_EVENACCESS                 __evenaccess
    #define R_BSP_EVENACCESS_SFR             __evenaccess
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__GNUC__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 /* none */
    #define R_BSP_EVENACCESS_SFR             /* none */
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__ICCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 volatile
    #define R_BSP_EVENACCESS_SFR             __sfr
    #define R_BSP_VOLATILE_SFR               volatile __sfr
    #define R_BSP_SFR                        __sfr

    #endif

    (K) リンカスクリプト内でインクルードされているリンカスクリプトのインクルードパスをリンカオプション-Lで指定

    今回、3つのプロジェクトの内の、tb_rx65n_scfg_freertos_fitプロジェクトでsim_rx65n_scfg_freertos_fitプロジェクトのソースフォルダを丸ごと使うようにしたかったので、e2 studio(というかEclipse)の「リンクされたフォルダ」という機能を使うようにしました。ただ、そうする為にはリンカスクリプト内で別のリンカスクリプトをインクルードしている箇所がパス付きになっていると都合が悪かった為、リンカスクリプト内のパスを削除して、リンカオプション-Lでパスを指定するようにしました。

    src/linker_script.ld

    変更前:

        .rvectors ALIGN(4):
        {
            _rvectors_start = .;
            INCLUDE ../src/smc_gen/r_bsp/mcu/all/linker_script_rvectors.inc
            _rvectors_end = .;
        } > ROM

    変更後:

        .rvectors ALIGN(4):
        {
            _rvectors_start = .;
            INCLUDE linker_script_rvectors.inc
            _rvectors_end = .;
        } > ROM

    e2 studioのGNURXのリンカ設定の画面コピー
    "${workspace_loc:/${ProjName}/src/smc_gen/r_bsp/mcu/all}"


    GCCのLDのマニュアルの抜粋
    sourceware.org/binutils/docs/ld/File-Commands.html


    (L) スタック情報生成の為に-fstack-usage -fdump-rtl-pro_and_epilogueを指定

    今回、以下のコンパイルオプションを指定して、GNURXでもスタック情報を生成させるようにしました。ただ、以下のスレッドに投稿したように、e2 studioのスタック解析ビューに表示される内容はどういうものなのか、調べてみる必要があるような気がします。

    e2 studio v7.5.0のStack Analysis ViewはGNURXでは1箇所でも関数ポインタで関数呼び出しするとERRORになって使えませんね
    japan.renesasrulz.com/cafe_rene/f/forum21/5987/e2-studio-v7-5-0-stack-analysis-view-gnurx-1-error/33319#33319

    e2 studioのGNURXのコンパイラ設定の画面コピー
    -fstack-usage -fdump-rtl-pro_and_epilogue


    (M) C言語標準ライブラリとしてnewlib-nano pre-buildを指定(ですが現状未使用かも知れません)

    今回、以下のリンカオプションを設定して、GNURXでC言語標準ライブラリとしてnewlib-nano pre-buildを指定してみました。(ですが、今回のプロジェクトでは、C言語標準ライブラリは使われていないかも知れません。)

    ちなみに、以下でGoogle検索してみたところ、newlib-nanoの代表的な注意点は、そのままではprintf系関数で浮動小数点フォーマットに従って数値を文字列化することが出来ない、ことのようです。どうも、GNUARMではコンパイルオプションでマクロ定義を行ってライブラリをリビルドすると出来るようになるようです。たぶん、GNURXでも同様なのではないかと思います。ただ、今回は(そのままでは出来ないことの確認も含めて)試してはいないです。

    Google検索: newlib nano
    www.google.co.jp/search?q=newlib+nano&lr=lang_ja

    e2 studioのGNURXのリンカ設定の画面コピー

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

    以下、コーディングの小技とコンパイラ設定/リンカ設定の説明です。なお、プロジェクトの全体構成は以下の画面コピーの通りです。



    (J) C言語拡張キーワード__evenaccess(CC-RX)/__sfr(ICCRX)/無し(GNURX)の差異を吸収するVOLATILEという#defineを用意

    CC-RXの__evenaccessキーワードについては、以下のスレッドを投稿したことがありますが、良く分からないまま長いこと放置してしまっています。ただ、IAR C/C++コンパイラにも同様のキーワード__sfrがあったり、GNURXではそういうキーワードが無かったり、といった差異がありますので、今回、以下の#defineを追加してみました。(私は、競合メーカーの「RXマイコンを使うべきではない5つの理由」みたいなマーケティング資料のネタにされそうな、このCC-RXの__evenaccessキーワードは不要になれば良いのになぁ、と思っていますが。(あとIAR C/C++コンパイラの__sfrも。))

    CC-RXでvolatile指定有り__evenaccess指定無しのobjectへのaccess sizeが保証されないのは言語規格上妥当なのかな?
    japan.renesasrulz.com/cafe_rene/f/forum5/5094/cc-rx-volatile-__evenaccess-object-access-size/30706#30706

    src/smc_gen/r_config/r_bsp_config.h

    /* For convenience to port programs from CC-RX to GNURX or ICCRX.
     */
    #define VOLATILE volatile R_BSP_EVENACCESS_SFR
    #if !defined(__CCRX__)
    #include "r_bsp_modified/GNURX_support/machine.h"
    #endif

    なお、R_BSP_EVENACCESS_SFRは以下のようにBSPモジュールで定義されているものです。

    src/smc_gen/r_bsp/mcu/all/r_compiler.h

    #if defined(__CCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile __evenaccess
    #define R_BSP_EVENACCESS                 __evenaccess
    #define R_BSP_EVENACCESS_SFR             __evenaccess
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__GNUC__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 /* none */
    #define R_BSP_EVENACCESS_SFR             /* none */
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__ICCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 volatile
    #define R_BSP_EVENACCESS_SFR             __sfr
    #define R_BSP_VOLATILE_SFR               volatile __sfr
    #define R_BSP_SFR                        __sfr

    #endif

    (K) リンカスクリプト内でインクルードされているリンカスクリプトのインクルードパスをリンカオプション-Lで指定

    今回、3つのプロジェクトの内の、tb_rx65n_scfg_freertos_fitプロジェクトでsim_rx65n_scfg_freertos_fitプロジェクトのソースフォルダを丸ごと使うようにしたかったので、e2 studio(というかEclipse)の「リンクされたフォルダ」という機能を使うようにしました。ただ、そうする為にはリンカスクリプト内で別のリンカスクリプトをインクルードしている箇所がパス付きになっていると都合が悪かった為、リンカスクリプト内のパスを削除して、リンカオプション-Lでパスを指定するようにしました。

    src/linker_script.ld

    変更前:

        .rvectors ALIGN(4):
        {
            _rvectors_start = .;
            INCLUDE ../src/smc_gen/r_bsp/mcu/all/linker_script_rvectors.inc
            _rvectors_end = .;
        } > ROM

    変更後:

        .rvectors ALIGN(4):
        {
            _rvectors_start = .;
            INCLUDE linker_script_rvectors.inc
            _rvectors_end = .;
        } > ROM

    e2 studioのGNURXのリンカ設定の画面コピー
    "${workspace_loc:/${ProjName}/src/smc_gen/r_bsp/mcu/all}"


    GCCのLDのマニュアルの抜粋
    sourceware.org/binutils/docs/ld/File-Commands.html


    (L) スタック情報生成の為に-fstack-usage -fdump-rtl-pro_and_epilogueを指定

    今回、以下のコンパイルオプションを指定して、GNURXでもスタック情報を生成させるようにしました。ただ、以下のスレッドに投稿したように、e2 studioのスタック解析ビューに表示される内容はどういうものなのか、調べてみる必要があるような気がします。

    e2 studio v7.5.0のStack Analysis ViewはGNURXでは1箇所でも関数ポインタで関数呼び出しするとERRORになって使えませんね
    japan.renesasrulz.com/cafe_rene/f/forum21/5987/e2-studio-v7-5-0-stack-analysis-view-gnurx-1-error/33319#33319

    e2 studioのGNURXのコンパイラ設定の画面コピー
    -fstack-usage -fdump-rtl-pro_and_epilogue


    (M) C言語標準ライブラリとしてnewlib-nano pre-buildを指定(ですが現状未使用かも知れません)

    今回、以下のリンカオプションを設定して、GNURXでC言語標準ライブラリとしてnewlib-nano pre-buildを指定してみました。(ですが、今回のプロジェクトでは、C言語標準ライブラリは使われていないかも知れません。)

    ちなみに、以下でGoogle検索してみたところ、newlib-nanoの代表的な注意点は、そのままではprintf系関数で浮動小数点フォーマットに従って数値を文字列化することが出来ない、ことのようです。どうも、GNUARMではコンパイルオプションでマクロ定義を行ってライブラリをリビルドすると出来るようになるようです。たぶん、GNURXでも同様なのではないかと思います。ただ、今回は(そのままでは出来ないことの確認も含めて)試してはいないです。

    Google検索: newlib nano
    www.google.co.jp/search?q=newlib+nano&lr=lang_ja

    e2 studioのGNURXのリンカ設定の画面コピー

Children
No Data