printfをコマンドラインに表示させたい

Former Member
Former Member

はじめまして。うっちーです。

JenkinsとμCUnitなどを使ってテストの自動化するために、printfの実行結果を標準出力などに表示させることができないか検討しています。
まず、e2studio(IDE)では、printfの出力が仮想コンソールに出力されることを確認しました。
そこで、次に e2-server-gdb.exe + rx-elf-gdb.exe + Renesas RX Simulatorで実行してみたところ、printfの出力がDOSプロンプトに表示されません。
どうすればprintfをコマンドラインに表示できるようになるか教えてください。

ツールチェイン: GCC for Renesas RX
lowlvl.src,lowsrc.c,lowsrc.hは、CCRXプロジェクトのものを流用しています。

よろしくお願いいたします。

  • うっちー さん、こんにちは。NoMaYです。

    今のところRenesas RX Simulatorに限らずE1/E20/E2Lite/E2でも、e2-server-gdb.exeへ出力された仮想コンソール表示データをe2 studio以外で取得する方法は開示されてないです。(VSCodeでデバッグするなら、無いより有った方が断然にいいなぁ、と思っていましたので、いずれルネサスさんに問い合わせようとは思っているのですけれど。なお、何かしら方法が見付かったとしても、rx-elf-gdb.exeから表示させることは無理かなぁ、とも思ってます。)

    CS+の方では、実はもう少し頑張れるのですけれども、rx-elf-gdb.exeで出来る似たようなこととしては、Dynamic Printfぐらしか無いです。

  • Former Member
    Former Member in reply to NoMaY

    NoMaYさん、こんにちは。

    やはりできないのですね。残念です…。

    ありがとうございました。

  • うっちー さん、こんにちは。NoMaYです。

    Dynamic Printfのメカニズムを使うという点では結局同じことなのですけれど、e2 studio上でのシミュレータでのデバッグ時の仮想コンソール出力のprintfの挿入箇所を、rx-elf-gdbによるテスト時も出来るだけ再利用したいといった考え方向けとして、以下のようなやり方が思い浮かびました。

    (1) 仮想コンソールサポートの最下層ルーチンに1文字出力関数があります。
    (2) 100文字程度の文字列バッファを確保します。
    (3) 上記(1)関数内で1文字出力したら上記(2)の文字列バッファにも書き込みます。
    (4) 上記(3)の後で文字をチェックして改行文字であればif文でnop()などを実行します。概念コードとしてはこんな感じです。

    仮想コンソールサポートの最下層ルーチン()
    {
        仮想コンソールへ1文字出力 <-- rx-elf-gdbでは表示されない
        文字列バッファの次の書き込み位置へ出力した文字を書き込む
        if( 書き込んだ文字 == '\n')
        {
            文字列バッファの次の書き込み位置へ0を書き込む
            nop(); <-- この位置にrx-elf-gdbのDynamic Printfを設定する(表示対象は文字列バッファ、表示形式は%s型)

            文字列バッファの次の書き込み位置を先頭に戻す処理
        }
    }

    (5) 文字列バッファが溢れそうになった時の対策は適宜

    なお、実マイコンの動作速度から見るとDynamic Printfは長時間に渡って実マイコンの動作が一時中断しますので、実マイコンの場合に関してはその点には留意しておいて下さい。

    ちなみに、Pass/Failの検出だけなら以下の方法でもとりあえず出来ると思います。

    RX Simulator環境でコマンドラインからプロジェクトを実行する
    japan.renesasrulz.com/cafe_rene/f/forum5/7608/rx-simulator/40128#40128

    それで気付いたのですけれど、Pass/Failはプログラム内から敢えて表示しようとしなくても、GDBがブレーク時に表示するメッセージだけでも区別出来そうですね、、、


  • Former Member
    Former Member in reply to NoMaY

    NoMaYさん、こんにちは。

    ご教授いただいた方法で、うまくいきました。

    gdb の Dynamic printf を知らなかったので、勉強になりました。

    ありがとうございました。