GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
お世話になります。
掲題の件、本来は mbed のフォーラムに問い合わせる内容かもしれませんが、GR-LYCHEE 向けに提供されたプログラムを拝見していると、PC でのデバッグ用に printf が使用されていましたので、Web Compiler フォーラムに投稿させて頂きます。もしわかる方がいらっしゃったら教えてください。
PC 上でデバッグするため printf を使用する場合には、通常、Serial pc(USBTX, USBRX); を宣言し、pc.printf("Hello World!"); などの記述をするかと思います。ところが、pc.printf ではなく、いきなり printf を記述しても pc.printf と同様のことができるように思われます。GR-LYCHEE のコードにも printf の記述があります。標準出力にプリントするという意味だと思うのですが、C++ 初心者ということもあり、コードを追って行っても、なぜ printf で良いのか、今一つ理解ができません( pc.printf の仕組みは、C++ の観点からコードを追っていくと理解できました。。。たぶん )。Web で検索しても、本を読んでも、PC でデバッグするときは printf が使用できるという記載はあるのですが、なぜという観点からの説明は見つかりませんでした。
[質問]
仕組みを理解したうえで printf を使用したいと思いますが、
1. マイコンから見て標準出力は COMポートを指すと思いますが正しいでしょうか?
2. 上記 1 が正しい場合、その記述は mbed ライブラリのどこにありますでしょうか?
3. printf を使用した場合、PC と Serial 通信する Baud Rate のでデフォルトは 9600 でしょうか?
4. 上記 3 において Baud Rate を変更できる場合、どこに記述するのでしょうか?
上記の質問の回答でなくても、初心者向けに、printf の仕組みが理解できる解説でも構いません。
以前、mbed のコードを書いていた時から、理解できずにモヤモヤしています。
恐れ入りますが、宜しくお願いいたします。
GR-LYCHEEを例に紹介します。(他のmbedボードもほぼ同じ作りです)
> 1. マイコンから見て標準出力は COMポートを指すと思いますが正しいでしょうか?
はい、正しいです。マイコン(GR-LYCHEE)からはUARTのシリアル通信で DAPLinkマイコンにデータを送信します。DAPLinkからPCへは、USBのCDCクラス通信で PC にデータ送信します。PC側はDAPLinkのCDCクラスをCOMポートとして認識しています。
GR-LYCHEE <- UART serial -> DAPLink <-- USB CDC class --> PC
~参考情報~GR-LYCHEE回路図http://japan.renesasrulz.com/cfs-file/__key/communityserver-discussions-components-files/153/X50A_2D00_M01_2D00_B4.pdf# 回路図中の PC11U35FHI33/501 がDAPLink用のマイコンになります。
> 2. 上記 1 が正しい場合、その記述は mbed ライブラリのどこにありますでしょうか?
mbed-os内 mbed_retarget.cpp の"PREFIX(_write)"にて実現しています。https://github.com/TomoYamanaka/mbed/blob/Feature_LYCHEE/platform/mbed_retarget.cpp#L311-L351
標準関数(コンパイラが用意している)のprintfの中から上記関数がコールされます。printfから実行された場合は"fh < 3"となり、「init_serial();」、「serial_putc(&stdio_uart, buffer[i]);」によってUART送信されます。printfに対応するUARTの端子は以下で定義されています。https://github.com/TomoYamanaka/mbed/blob/Feature_LYCHEE/targets/TARGET_RENESAS/TARGET_RZA1XX/TARGET_GR_LYCHEE/PeripheralNames.h#L93-L95
> 3. printf を使用した場合、PC と Serial 通信する Baud Rate のでデフォルトは 9600 でしょうか?
はい、9600bpsです。
> 4. 上記 3 において Baud Rate を変更できる場合、どこに記述するのでしょうか?
mbed環境(mbedオンラインコンパイラ、CLIなど)では、プロジェクトフォルダのトップ(通常 main.cpp が置かれるフォルダ)の "mbed_app.json" に以下のように記載するとデフォルトのBaud Rateを変更することができます。(お使いのプロジェクト内に "mbed_app.json" が無い場合は新規に作成します)
上記のように記載すると、コンパイル時に自動生成される"mbed_config.h"の下記マクロが書き換わります。
#define MBED_CONF_PLATFORM_STDIO_BAUD_RATE 9600 // set by library:platform
Renesas Web Compilerで使用する場合は"mbed_app.json"の内容は反映されませんので、プロジェクト内にある"mbed_config.h"のMBED_CONF_PLATFORM_STDIO_BAUD_RATEを直接書き換えてください。