こんにちは。
ハギと申します。
RX Simulatorでコマンドラインからプロジェクトを実行することは可能なのでしょうか。
最終的にやりたいことは、「Github Actionsを使ってGithubにpushをしたら、self hosted環境でユニットテストを自動で実行する」というようなことです。
現在、GUIのe2studioのRX Simulator環境でユニットテストを行い、Renesas Debug Virtual Consoleに結果を表示するということはできています。
また、コマンドラインでビルドは以下のページによると可能とのこと。
https://ja-support.renesas.com/knowledgeBase/17797621
よって、後はコマンドラインからテストの実行さえできればやりたいことができそうな気がしていますが、このようなことは可能なのでしょうか。
ハギさん、こんにちは。NoMaYです。e2 studioに同梱されているrx-elf-gdb.exe+e2-server-gdb.exe+Renesas RX Simulatorのコマンドラインからの実行が出来るかどうか、今夜にでも試してみようと思いました。(実は以前から気になっていて今回が何かの契機のような気がしましたので。)その一方で、CS+にコマンドライン版というものがあり、以下のことが出来ます。また、コンパイラにCC-RXを使用しているのであれば、e2 studioでビルドしたabsファイルはCS+のRenesas RX Simulatorでも読み込めます。あと、GUI版にしろコマンドライン版にしろ、デバッグ専用プロジェクトというものが作れるようになっていてビルド時のプロジェクトとは独立した簡素なプロジェクトで済ませることも出来ます。(以下は昔の話ですが今でも大丈夫だと思うのですけれど。)(1) mtpjファイルを読み込んでビルドする(2) mtpjファイル+absファイルを読み込んでRenesas RX Simulatorを実行すること実行結果のPass/Fail/それらに限らずMessage文字列の表示は、Debug Virtual Consoleでなくても、以下の方法でも出来ると思うのです。(これは実はまだコマンドライン版では試してませんけれど。)(A) GDBであればDynamic Printfでコマンドプロンプトへメッセージを表示する(B) CS+コマンドライン版であればAction Eventでコマンドプロンプトへメッセージを表示するなお、どうも今のところCS+でしか使えないようですが、CS+のRenesas RX Simulatorでは以下のことも出来ます。(これも実はまだコマンドライン版では試してませんけれど。)(C) ファイル入出力今のところ頭に思い浮かんでいるのは、こういったところです、、、
NoMaYさん
ハギです。
いつもお世話になってます。
情報ありがとうございます。
いただいた情報をもとに私の方でも試してみたいと思います。
ハギさん、こんにちは。NoMaYです。途中経過です。rx-elf-gdb.exe+e2-server-gdb.exe+Renesas RX Simulatorでコマンドラインから起動後、GDBとGDBSERVERを接続するところまでが出来ました。(以下の画面コピー) これから、ダウンロード、実行、Pass/Failの表示、など試してみます。以下、参考にした資料です。統合開発環境 e² studio を使用したリモートデバッグの方法R20AN0630JJ0100 Rev.1.00 Sep.01.21www.renesas.com/jp/ja/document/apn/how-use-remote-debugging-integrated-development-environment-e-studiolaunch rx-elf-gdb.exe without e2 studiohttps://www.google.com/search?q=renesasrulz.com/the_vault/f/archive-forum/8621/launch-rx-elf-gdb-exe-without-e2-studioNon-Stop Mode (Debugging with GDB)sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html以下、画面コピーです。GDBSERVER側 ([追記] 2021/11/06 00:00 すみません。環境変数設定は余分でした。ごめんなさい。)GDB側 ([追記] 2021/11/06 00:00 すみません。環境変数設定が抜けています。ごめんなさい。)以下、入力したコマンドです。GDBSERVER側 ([追記] 2021/11/06 00:00 すみません。環境変数設定を削除しました。)cd /d C:\Renesas\e2studio64\SupportFiles\.eclipse\com.renesas.platform_1643561029\DebugComp\RXe2-server-gdb -p 60916 -g SIMULATOR -t R5F572NN -uPeripheralClkRatio= 4 -uCpuClkFreq= 240 -uRegisterSetting= 0 -uModePin= 0 -uCacheDecode= 1 -uIOModule= IodllForCMT.dll -uIOModule= IodllForICU_dpfpu.dll -n 0 -uWorkRamAddress= 0 -uEmStopInt= 0 -uEmStopInterrupt= 0 -uEmStopFPexp= 0 -l -uCore= SINGLE_CORE^|enabled^|1^|main -uSyncMode= async -uFirstGDB= main GDB側 ([追記] 2021/11/06 00:00 すみません。環境変数設定を追加しました。)cd /d C:\Renesas\e2studio64\SupportFiles\.eclipse\com.renesas.platform_1643561029\DebugComp\RXset Path=C:\Renesas\e2studio64_v202110\eclipse\runtimes\python\2.7.12_x86;%Path%set PYTHONPATH=C:\Renesas\e2studio64_v202110\eclipse\runtimes\python\2.7.12_x86\librx-elf-gdb -rx-force-isa=v3 -rx-force-double-fpu set pagination offset non-stop ontarget extended-remote-rx localhost:60916
ハギさん、こんにちは。NoMaYです。途中経過その2です。ダウンロード、実行、Pass/Failの表示、など試してみました。それで気付いたのですけれど、Pass/Failはプログラム内から敢えて表示しようとしなくても、GDBがブレーク時に表示するメッセージだけでも区別出来そうですね、、、この後、ブレークしたらGDBを終了させるという方法を調べてみます。ただ、これも気付いたことですけれど、決められた時間内にPass/Failで終了しなかった場合に強制終了するフェールセーフも本当はあった方が良さそうですけど、そこまでは手が回りそうにないです、、、以下、画面コピーです。以下、コマンドとソースです。
file C:/Renesas/GitHubDesktop/workspaces/workspace_e2v202110/TestProgRun/HardwareDebug/TestProgRun.xset pagination offset non-stop ontarget extended-remote-rx localhost:60916monitor enable_execute_on_connectmonitor enable_stopped_notify_on_connect# wait for a notificationloadb Passb Faili bc
#include "r_smc_entry.h"#include "rpbrx72ndef.h"#pragma noinline Pass#pragma noinline Failvoid Pass(void);void Fail(void);int main(void){ Pass(); //Fail(); for (;;) ;}void Pass(void){ for (;;) ;}void Fail(void){ for (;;) ;}
ハギさん、こんにちは。NoMaYです。ひとまずそれっぽいことが出来ました。以下のコマンド入力ファイルを作成し、標準入力をリダイレクトしてGDBに実行させてみました。(実は他にも試してみたのですが、どうも何かしらデリケートなタイミング案件があるようで、何とか動いたのが標準入力をリダイレクトする方法でした。) 週明け、コマンドライン版CS+もやってみます。以下、画面コピーです。([追記] 2021/11/06 00:00 すみません。環境変数設定が抜けています。ごめんなさい。)以下、コマンドとコマンド入力ファイルです。([追記] 2021/11/06 00:00 すみません。環境変数設定を追加しました。)cd /d C:\Renesas\e2studio64\SupportFiles\.eclipse\com.renesas.platform_1643561029\DebugComp\RXset Path=C:\Renesas\e2studio64_v202110\eclipse\runtimes\python\2.7.12_x86;%Path%set PYTHONPATH=C:\Renesas\e2studio64_v202110\eclipse\runtimes\python\2.7.12_x86\librx-elf-gdb -rx-force-isa=v3 -rx-force-double-fpu --silent C:/Renesas/GitHubDesktop/workspaces/workspace_e2v202110/TestProgRun/HardwareDebug/TestProgRun.x < C:\Renesas\GitHubDesktop\workspaces\workspace_e2v202110\TestProgRun\TestProgRun.gdbcmdTestProgRun.gdbcmd
set pagination offset non-stop ontarget extended-remote-rx localhost:60916monitor enable_stopped_notify_on_connectmonitor enable_execute_on_connect# wait for a notificationloadb Passb Failcq
[追記] 2021/10/30 13:00すみません、うっかり試行錯誤中にやっていたコマンドが紛れ込んだまま投稿してしまいました。以下のコマンドは削除しました。TestProgRun.gdbcmd
set pagination offset non-stop onset target-async ontarget extended-remote-rx localhost:60916monitor enable_stopped_notify_on_connectmonitor enable_execute_on_connect# wait for a notificationloadb Passb Failcq
ハギさん、こんにちは。NoMaYです。コマンドライン版CS+の方ですが、まずはIronPythonスクリプト側を出来るだけ簡素にして予めGUI版CS+でお膳立てした設定(mtpjでは無くてmtudに設定が格納されます)を使用する方法でやってみました。次はIronPythonスクリプト側で全ての設定を行う方法をやってみます。(その後でデバッグ専用プロジェクトについてもやります。)以下、画面コピーです。
調査と実験ありがとうございます。
私の方の手が止まっており申し訳ございません。
来週からこの件に手を付けられそうなので、試した結果をまたお知らせします。
ハギさん、こんにちは。NoMaYです。今回はIronPythonスクリプト側で全ての設定を行う方法でもやってみました。(先日のものはIronPythonスクリプト側を出来るだけ簡素にして予めGUI版CS+でお膳立てした設定(mtpjでは無くてmtudに設定が格納されます)を使用する方法でした。次はデバッグ専用プロジェクトでやってみます。)以下、スクリプトです。
# Run a program with Pass/Fail message in CubeSuite+.execommon.ThrowExcept = Truecommon.ViewOutput = False# Downloaddebugger.Connect()debugger.Download.LoadModule()# Prepare Breakpoint(s)bp = BreakCondition()if debugger.DebugTool.GetType() != DebugTool.Simulator: bp.BreakType = BreakType.Softwarebp.Address = "_Exit"debugger.Breakpoint.Set(bp)# Prepare ActionEvent(s)ae = ActionEventCondition()ae.ActionEventType = ActionEventType.Printfae.Address = "_Pass"ae.Output = "Pass"debugger.ActionEvent.Set(ae)ae.Address = "_Fail"ae.Output = "Fail"debugger.ActionEvent.Set(ae)# Rundebugger.Run(RunOption.WaitBreak)
以下、画面コピーです。Passの場合Failの場合
ハギさん、こんにちは。NoMaYです。デバッグ専用プロジェクトですが以下のように作成すれば手間が少なそうです。(ひとつ作成するだけで良いです。) IronPythonスクリプトは先ほどのものがそのまま使用出来ます。(1) e2 studio上でrcpcファイルを生成する(2) GUI版CS+でrcpcファイルを開く(というかプロジェクトを変換するという作業になります)(3) 変換するプロジェクトの種類としてデバッグ専用プロジェクトを指定する(4) 必要であればシミュレータの設定を変更する(5) 変換後のプロジェクトからソースファイル等を登録解除して、 変換後のプロジェクトへダウンロードファイルを登録追加する以下、画面コピーです。
ふと疑問に思ったのですが、gdbを使う必要ってあるのでしょうか。
私のイメージだと、RX Simulatorの実行ファイルがrxsimulator、テスト対象のファイルをtest.xだと仮定すると以下のようなコマンドになるのかなと思いました。
rxsimulator test.x
ただ、RX Simulatorの実行ファイルというのがあるのかどうかわかりません。
e2-server-gdb.exeなどが置いてあるフォルダにrx-elf-run.exeというのがあり、これかと思い以下のコマンドを実行してみました。
rx-elf-run.exe -w test.x
しかし、以下のログを吐いてエラー終了していまいます。
Read from unwritten memory at 0xffffffd4Read from unwritten memory at 0xffffffd5Read from unwritten memory at 0xffffffd6Read from unwritten memory at 0xffffffd7Unhandled access violation exception at pc = 0
例外ベクタテーブルを0xFFFFFF80に配置しているので、0xFFFFFFD4に飛ぶということはアクセス例外が発生しているということでしょうか。
プログラムを実行しているように見えますが、rx-elf-run.exeはRX Simulatorとは別物なのでしょうか。
何かご存じであればご教示いただきたいです。