Team for GR-PEACH Producer Meeting

printf()について

04 Dec 2014

以前、質問をさせていただきました。
https://developer.mbed.org/questions/5446/1417318275/
まだ議論が始まっていないので、こちらに再掲させていただきます。
printf()の出力タイミングに違和感があるとコメントしたのですが、プログラムを修正して動作を確認したところ、Debug用のprintf()とコンストラクタ宣言してのprintf()では動作振る舞いが違うことが判明しました。
原因は私にはわかりませんが、対応をお願いできないでしょうか?
プログラムは、下記ですでにrevision upしています。

Import programGR-PEACH_blinky

Test program GR-PEACH


05 Dec 2014

ちょっと気にたのですが、サンプルではSerail宣言していますが、 他のmbedですとserial宣言しなくてもprintfで出てきますが、 GR-PEACH ですと宣言しないと出てこないのですが、私の環境だけかな。。 と思いpostしてみました。ついでですがよろしくお願いします。

05 Dec 2014

Yamasugeさん、
上記サンプルソフトで、
#define DISP_COM
をコメントアウトか削除してみてください。問題なくコンパイラが通ります。
従って、ご質問の「 GR-PEACH ですと宣言しないと出てこないのですが、私の環境だけかな」には、
(少なくとも私の環境では)どちらでも結果として、大丈夫です
が回答になります。
私の環境は、Windows7とPC側でTera Termを使用しています。

ここから下は、質問への回答ではありません。読み飛ばしてください。私が最初にこの議論を始めた理由に遡ってのコメントと解説です。
上記で"結果として"と回答したのは、コンストラクタ宣言では、シリアル通信ラインを使って(ポートのピンアサインも指定して)書式付入出力関数であるprintf()関数を利用できる環境でシリアルポートから出力していることです。
上記サンプルソフトでは、
Serial pcm(USBTX, USBRX);
と宣言していますので、USB(これはややこしいですがRZ/A1HのUSBでなくPC接続したUSBポートでインターフェイスチップ側)経由の仮想COMラインにRZ/A1HのUARTを接続しています。
どこに接続しているのでしょうか?
回路図を追うか、PinNames.hを覗くと、
USBTX = P6_3 USBRX = P6_2
と判明します。
それに対して、ただのprintf()はどうして機能するかは、ここに書かれています。
http://developer.mbed.org/handbook/SerialPC
後半に、
The C stdin, stdout and stderr file handles are also defaulted to the PC serial connection
とあり、Cのstdin/stdoutが上記UARTと同じに設定されているためです。
従って、mbed内部ではUARTのレジスタを操作する前までは全く違った処理を経由している(?) と思われます。

再再掲です。
「何故、上記サンプルソフトで経由経路が変わるとふるまいを変えないといけないのか?」
まだわかりません。

05 Dec 2014

Araiさん

確認、ありがとうございます。 再度、確認してみました。 無事に動作いたしました。今回の確認中に気づいたのですが、 私の環境ですと、書換がうまくいかない場合があったみたいです。 (やはり私の環境の問題な模様です。)

07 Dec 2014

serial宣言しなでprintfを行う場合、retarget.cpp内でposixインタフェースを経由して出力します。
詳細は以下リンクを参照ください。
http://developer.mbed.org/forum/mbed/topic/5269/?page=1#comment-25980

08 Dec 2014

Hagimotoさん
中の人に反応してもらい一安心しました。
上記掲載のプログラムがわかりにくいので、動作させたとしても何を言っているのか理解してもらえないことに気づきました。
大変失礼しました。

#define DISP_COM

をコメントアウト(定義せず)実行すると、PC側のVCOM出力は、
R=OFF,G=OFF,B=OFF RF,GF,BF,UN passed 155 Sec
などと、ライン一行が同時に表示されます(それも5秒待ってから)。
これに対して、

#define DISP_COM

を定義してコンパイルしたものは、
R=OFF,G=OFF,B=OFF RF,GF,BF,UN
が先ず画面に現れて、その後5秒経過したのちに、
passed 65 Sec
などと続きます。

間違いを探せ的に分かりづらくて、回答をいただけていない、
再再掲です。
「何故、上記サンプルソフトで経由経路が変わるとふるまいを変えないといけないのか?」
まだわかりません。

に何かコメントいただけますか?

09 Dec 2014

調査したところ、以下のような動作をしています。

  • 「#define DISP_COM」を有効にした場合:
    直接"retarget.cpp"の関数をコールして出力します。
    この場合、呼び出したタイミングでシリアル出力関数がコールされます。

  • 「#define DISP_COM」を無効にした場合:
    posixインタフェースを経由して"retarget.cpp"から出力します。
    この場合、改行コードが来るまでシリアル出力関数がコールされません。
    posixでは「すべての行は改行コードで終わる」と定義されているため、このような実装になっていると思われます。

ARMさんに確認します。

09 Dec 2014

お手数おかけしました。debugでprintfを使う時は改行が必須ということですね。無知でした。