printf出力について

RL78/G13 CS+CA,CX V3.02.00を使っています。

mainプログラム上で、printf分により出力した結果は、どこにどのように表示されるのでしょうか?

Pythonプラグインなども追加したり、FAQなども見たのですが、理解できませんでした。

よろしくお願いします。

  • > mainプログラム上で、printf分により出力した結果は、どこにどのように表示されるのでしょうか?

    printf() 関数を使用した場合とアクション・イベントのひとつである Printf
    イベントを設定した場合とで異なりますが、どっちの話をされてますか?
    両者が別物であることを理解されれば CS+ のヘルプを参照されることで問題も解決すると思いますが。
  • 先の質問は、printf()関数を使用した場合です。
    ヘルプを見たとき、アクションイベントのprintfについて記述がありましたが、printf()関数とは別物と思い深く見ていません。
  • CS+ のヘルプの printf() 関数と putchar() 関数の項目は参照されてますか?
  • liuさん、こんにちは。

    CA78K0Rではputchar()のソースはCS+\CACX\CA78K0R\V1.72\Src\cc78k0r\src\putchar.asmにあったのですが、CC-RLでは無くなっていますね。なお、出力先を変更するには、これをCC-RL対応に変更した上で且つ(←大変ごめんなさい、私はliuさんの質問で勘違いしていましたね)変更して出力先を変更するか、出力先を変更したものを最初からC言語で書いてしまうか、といったことをする必要がありそうです。また、CA78K0Rではgetchar.asmやシミュレータ用の_putchar.asmも用意されていました。(ちなみに、別スレッドの話になりますがRENESAS ELECTRONICS CONFIDENTIALとなっています、、、) 私は、これとチョコ様のコード生成のサンプルプログラムのUART関数を組み合わせられないか試してみたくなっています。チョコ様が幾つかサンプルを公開されていますので、どれと組み合わせるのが良いかは要検討ですが、、、

    fujita nozomu様wrote: said:
    CS+ のヘルプの printf() 関数と putchar() 関数の項目は参照されてますか? [引用終]


    [追記]

    すみません。シミュレータ用の_putchar.asmはRL78用ではなくて78K0R用かもしれませんCS+以前の時代の名残かもしれません(RL78/78K0R/78K0で試してみましたが何処にも出力されないようでしたので)。

  • わわいです
    こういうOSなしの環境(ベアメタルとも言う)でのprintf 関数は、その出力先を自分で用意する必要があります
    たいていはSCIのシリアル入出力に標準入出力を割り当てることになると思います。
    そこらへんはコンパイラ、あるいは標準ライブラリのマニュアルに説明が書かれてるかと思いますので、そこら辺探してみてください
    まあ、ところが、printf関数やscanf関数などは、関数規模が大きい、とかRAM消費量が大きいとかいろいろと制約が多いため、あえてこれらの関数は使用しない、あるいは使用できないことが大半だとは思います。

    ということで、あんましこういう標準入出力を使うような関数を使うようには考えないほうがいいかと思います
  • 標準の putchar() はデバガで逆アセンブル表示すると

    _putchar:
           60          MOV             A,X
           9d00        MOV             P0,A
           72          MOV             C,A
           f3          CLRB            B
           d7          RET             
    

    という内容なので、78K0R 用として CA78K0R に収録されてる putchar.asm と同じ内容ですね。

    デバッグ・コンソールの使い方について、RX の情報はすぐ見つかるのですが RL78 用のそれは見当たらないので機能としては提供されていないのだと思います。UART を使うなり Printf イベントを併用するなりの工夫が必要でしょう。

    putchar() を下記の実装とし、 

    int putchar(int c)
    {
        static char _[100];
        static size_t i = 0;
        if (c == '\n' || ((_[i++] = (char)c), i >= sizeof(_) - 2)) {
            memset(&_[i], 0, sizeof(_) - i);
            i = 0;
        }
        return c;
    }
    

    i =0; の行に Printf イベントを設定し _[] の内容を出力するようすると一応は printf() で出力もできますが、Printf イベントを含むイベントはステップ実行中は機能しないなどわけのわからん仕様となっていて使い辛いです。ハードウェア機能に余裕があれば UART で出力するのが良いと思います。

  • アドバイスをして頂いた皆様、ありがとうございました。
    CS+のような高機能なデバッガを使用するのが初めてで、勝手な思い込みでprintf()関数出力がデバッグ機能として画面出力に繋がっていると思い込んでおりました。ヘルプを再度見直してみます。
    頂きました、諸々のアドバイスでもやもやがすっきりしました。