こんにちは。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/436sim_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版で相違のあるソースファイル
こんにちは。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#30706src/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#33319e2 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 nanowww.google.co.jp/search?q=newlib+nano&lr=lang_jae2 studioのGNURXのリンカ設定の画面コピー