今回はログ出力などに関するお話です。
前回つくったGPIOサンプルを使って解説します。
この記事は JTAG でデバッグすることを前提にして書いています。
環境構築については こちら をご覧になってください。
投稿時の開発環境を記しておきます。
PC:
Windows10 OS
開発ボード :
ESP32-DevKitCーVE
(Soc : ESP32-D0WD-V3)
デバッガー(H/W):
FT2232D
デバッガー (S/W) :
Visual Studio Code + PlatformIO + ESP-IDF Framework
プロジェクトを開く
前回 つくったGPIOのプロジェクト ESP32E-GPIOinOut を開きます。
VSCodeを閉じる時に、特に File – Close Folder をしていなければプロジェクトがそのまま開かれていると思います。
もし閉じた状態であれば、 File – Open Folder から ESP32E-GPIOinOut を開きます。
デバッグを開始する
Run – Start Debugging (またはF5キー)でデバッグを開始します。
少し時間がかかります。
ステータスバーが青からオレンジ色になるまで待ちます。
もう少し、はやくならないのか・・・(^_^)?
Monitorを開始する
Monitor はシリアル通信を監視する機能です。
PlatformIOのツリーからMonitorを選択します。

画面下部の TERMINAL に以下の表示が出たら、Silicon Labs CP210x USB to UART Bridge の番号(この場面では 1)を指定します。
まずフォーカスをあてる必要があるので、 name: の右あたりをクリック後 1 を入力して enter します。

コンフィグレーションの設定により、printf()とログは UART0 TX 端子から出力されます。
ESP32-DevKitCーVE の回路図を見ると、UART0 TX は CP210X を介して USB コネクタから出力されているので、ここをモニターすることになります。
プログラムを実行する
ステータスバーがオレンジ色になり、カーソルが app_main()の下に来たら F5キーを押してプログラムを実行します。
すると画面下部の TERMINAL に printf()とログ出力が表示されます。
このようにすると printf()デバッグすることができます。
ログ出力とは?
詳しく知りたい方はAPIリファレンスの ロギング を参照してください。
サンプルプログラムにはログ出力が、ところどころに埋め込まれています。
printf()は単なる文字列の出力ですが、ログの場合には、タグをつけてモジュール別の情報を出力することができます。
ファイル別にタグをかえれば、どのファイルから出力された情報なのか辿ることができます。
冗長度に応じていくつかのマクロが用意されています。
レベルが5段階あり、下に行くほどレベルは低いとされていますが情報としては重要ではないでしょうか。
ESP_LOGV – verbose : 詳細 (レベル高)
ESP_LOGD – debug : デバッグ
ESP_LOGI – info : 情報
ESP_LOGW – warning : 警告
ESP_LOGE – error : エラー (レベル低)
どのレベルまで出力するのか設定することができます。
設定したレベルより低いものだけが出力されます。
例えば info(情報) を設定すると、 info, warning, error の3つが出力の対象になります。
コンフィグレーションでログの出力レベル設定することができるようになっていて、デフォルトでは info(情報)が設定されています。
ですからデフォルトでは info(情報), warning(警告), error(エラー)がログ出力されることなります。
esp_log_level_set()を使うとプログラムでレベルの設定ができます。
例えば gpioに関するファイル上で、
const char *TAG = "gpio";
esp_log_level_set(TAG, ESP_LOG_DEBUG);
とすれば、gpioモジュールのデバッグから下のログを出力することができます。
この第1引数の TAG部分にはワイルドカードも使えるので、
esp_log_level_set("*", ESP_LOG_DEBUG);
とすれば、全てのモジュールのデバッグから下のログを出力することができます。
ログ出力を確認する
main.c の gpio_config(&io_conf); の行にカーソルをあてて、F9キーを押してブレークポイントを貼り、F5キーで実行します。
gpio_config()で停止したら、F11キーを押して、関数の中に入っていきます。
関数の中に ESP_LOGI() があるので、その行にカーソルをあてて、F9キーを押してブレークポイントを貼り、F5キーで実行します。
画面下部は TERMINAL を表示させておき、Monitorを動かしておきます。
ブレーク後に、F10キーを押してステップ実行すると、TERMINALには以下のログが表示されました。
␛[0;32mI (252) gpio: GPIO[18]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0 ␛[0m
単にprintf()出力するよりは、付加情報(例えばログ出力しているファイル名)も出力してくれるので便利ですね。