RX Simulator環境でコマンドラインからプロジェクトを実行する

こんにちは。

ハギと申します。

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.21
    www.renesas.com/jp/ja/document/apn/how-use-remote-debugging-integrated-development-environment-e-studio

    launch rx-elf-gdb.exe without e2 studio
    https://www.google.com/search?q=renesasrulz.com/the_vault/f/archive-forum/8621/launch-rx-elf-gdb-exe-without-e2-studio

    Non-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\RX

    e2-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\RX

    set 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\lib

    rx-elf-gdb -rx-force-isa=v3 -rx-force-double-fpu


     
    set pagination off

    set non-stop on

    target 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.x
    set pagination off
    set non-stop on
    target extended-remote-rx localhost:60916
    monitor enable_execute_on_connect
    monitor enable_stopped_notify_on_connect
    # wait for a notification
    load
    b Pass
    b Fail
    i b
    c

     

    #include "r_smc_entry.h"
    #include "rpbrx72ndef.h"

    #pragma noinline Pass
    #pragma noinline Fail
    void 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\RX

    set 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\lib

    rx-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.gdbcmd


    TestProgRun.gdbcmd

    set pagination off
    set non-stop on
    target extended-remote-rx localhost:60916
    monitor enable_stopped_notify_on_connect
    monitor enable_execute_on_connect
    # wait for a notification
    load
    b Pass
    b Fail
    c
    q

     
    [追記] 2021/10/30 13:00

    すみません、うっかり試行錯誤中にやっていたコマンドが紛れ込んだまま投稿してしまいました。以下のコマンドは削除しました。

    TestProgRun.gdbcmd

    set pagination off
    set non-stop on
    set target-async on
    target extended-remote-rx localhost:60916
    monitor enable_stopped_notify_on_connect
    monitor enable_execute_on_connect
    # wait for a notification
    load
    b Pass
    b Fail
    c
    q

     

  • ハギさん、こんにちは。NoMaYです。

    コマンドライン版CS+の方ですが、まずはIronPythonスクリプト側を出来るだけ簡素にして予めGUI版CS+でお膳立てした設定(mtpjでは無くてmtudに設定が格納されます)を使用する方法でやってみました。次はIronPythonスクリプト側で全ての設定を行う方法をやってみます。(その後でデバッグ専用プロジェクトについてもやります。)

    以下、画面コピーです。



     

  • NoMaYさん

    ハギです。

    調査と実験ありがとうございます。

    私の方の手が止まっており申し訳ございません。

    来週からこの件に手を付けられそうなので、試した結果をまたお知らせします。

  • ハギさん、こんにちは。NoMaYです。

    今回はIronPythonスクリプト側で全ての設定を行う方法でもやってみました。(先日のものはIronPythonスクリプト側を出来るだけ簡素にして予めGUI版CS+でお膳立てした設定(mtpjでは無くてmtudに設定が格納されます)を使用する方法でした。次はデバッグ専用プロジェクトでやってみます。)

    以下、スクリプトです。

    # Run a program with Pass/Fail message in CubeSuite+.exe

    common.ThrowExcept = True
    common.ViewOutput  = False

    # Download
    debugger.Connect()
    debugger.Download.LoadModule()

    # Prepare Breakpoint(s)
    bp = BreakCondition()
    if debugger.DebugTool.GetType() != DebugTool.Simulator:
        bp.BreakType = BreakType.Software
    bp.Address = "_Exit"
    debugger.Breakpoint.Set(bp)

    # Prepare ActionEvent(s)
    ae = ActionEventCondition()
    ae.ActionEventType = ActionEventType.Printf
    ae.Address = "_Pass"
    ae.Output = "Pass"
    debugger.ActionEvent.Set(ae)
    ae.Address = "_Fail"
    ae.Output = "Fail"
    debugger.ActionEvent.Set(ae)

    # Run
    debugger.Run(RunOption.WaitBreak)

     
    以下、画面コピーです。

    Passの場合



    Failの場合


     

  • ハギさん、こんにちは。NoMaYです。

    デバッグ専用プロジェクトですが以下のように作成すれば手間が少なそうです。(ひとつ作成するだけで良いです。) IronPythonスクリプトは先ほどのものがそのまま使用出来ます。

    (1) e2 studio上でrcpcファイルを生成する
    (2) GUI版CS+でrcpcファイルを開く(というかプロジェクトを変換するという作業になります)
    (3) 変換するプロジェクトの種類としてデバッグ専用プロジェクトを指定する
    (4) 必要であればシミュレータの設定を変更する
    (5) 変換後のプロジェクトからソースファイル等を登録解除して、 変換後のプロジェクトへダウンロードファイルを登録追加する

    以下、画面コピーです。






     

  • NoMaYさん

    ハギです。

    情報ありがとうございます。

    ふと疑問に思ったのですが、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 0xffffffd4
    Read from unwritten memory at 0xffffffd5
    Read from unwritten memory at 0xffffffd6
    Read from unwritten memory at 0xffffffd7
    Unhandled access violation exception at pc = 0

    例外ベクタテーブルを0xFFFFFF80に配置しているので、0xFFFFFFD4に飛ぶということはアクセス例外が発生しているということでしょうか。

    プログラムを実行しているように見えますが、rx-elf-run.exeはRX Simulatorとは別物なのでしょうか。

    何かご存じであればご教示いただきたいです。