(2) もう一度確認

ESP-IDFのインストールが無事出来た所でもう一度サンプルプログラムのコンパイル、実行に付いて見ていきます。

サンプルプログラムの読み込み

前回のインストール編でサンプルプログラム以下の様に準備しました。

これはget-startedフォルダに有るhello-worldホルダーをespフォルダの下にコピーしただけです。そこで

”~/esp/esp-idf/examples/get-started/” を見ると、

確かに”hello_world” フォルダが有ります。ちなみに一つ上のフォルダ(”esp/esp-idf/examples/”)を見ると

こんな感じになっていました。これらは色々なサンプルプログラムと思います。

”hello_world”ホルダーの確認

~/esp フォルダに戻って、前回コピーされた”hello_world” フォルダを削除して、再び、”cp -r $IDF_PATH/examples/get-started/hello_world .” を実行して”hello_world”フォルダをコピーしました。中身を確認すると以下のファイルが入っていました。

”README.md”ファイルを見ると、このフォルダの説明が有りました。

追加の詳細は、(https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html)を参照とあるのでそこへ行き、そこでこの様な記述を見つけました。

  • “project”はアプリをコンパイル実行する為に必要なファイルを全て含んだディレクトリです。
  • “Project configuration”はルートディレクトリのsdkconfigファイルに保持されます。変更はidf.py menuconfigで行う。
  • “app”は1つのプロジェクト。次の2つのアプリがビルドされる。
    • “project app”:メインの実行可能ファイル
    • “bootloader app”:プロジェクトアプリを起動する最初のブートローダープログラム
  • “components”はコンパイルされ、アプリにリンクされるスタンドアロンコードのモジュール
  • “Target”は、使用するハードウェア。 ESP-IDFでサポートされているターゲットは、idf.py –list-targetsで確認でる。

”hello_world”をこれに当てはめてみると

  • “project” ー> ”hello_world”
  • “Project configuration” ルートディレクトリのsdkconfig
    • ルートディレクトリに ”sdkconfig.ci” は有るが、”sdkconfig”は無い
    • しかも、 ”sdkconfig.ci” のサイズは 0バイトなにも書かれていません。
  • “app”は1つのプロジェクトで2つのアプリがビルドされる。
    • これに当てはまるものは無い。
    • ビルド前なので当然か
  • “components”はコンパイルされ。。。
    • Read.meではmainディレクトリの下に有るように書かれているが実際は無かった
  • “Target”は、使用するハードウェア。
    • 今回は ESP32を指定する。

でしょうか。

次は、Targetとmenuconfig

次に行ったコマンドは、

先ずは、”idf.py set-target esp32”を実行して見ます。モニターに色んな出力が出て、最後に
-- Configuring done
-- Generating done
-- Build files have been written to: 〜/esp/hello_world/build
と表示されました。この時点で、”hello_world”フォルダーを確認してみると

“build”フォルダと”sdkconfig”ファイルが追加されています。”build”フォルダを開けると

沢山のファイルが作られています。”bootloader”というネームが見られますがまだビルドしていません。

次に”sdkconfig”ファイルをチェック。今度は中身が有りました。

これはファイルの一部ですが、色んなパラメータの設定が書かれています。

説明では”idf.py set-target”は各プロダクト最初の1回のみ実行と有りました。そこで試しにもう一度、”idf.py set-target esp32”を実行して見ると同じ様にモニターにメッセージが表示されましたが新しい事は起こりませんでした。”idf.py set-target” はターゲット用の”sdkconfig”ファイルを作成するコマンドの様です。

”sdkconfig”ファイルが出来たので”idf.py menuconfig”を実行します。良く見ると設定画面が説明の画面と少し違っていました。以下に説明の画面

Project configuration - Home window

今回の画面

実際に立ち上げた画面には以下の2つの項目が有りません。

  • SDK tool configration —>
  • Compatibility options —>

説明ではこの画面での設定は何も行わず終了しています。バージョンの違いでしょうか。取り敢えず次に進みます。

次はBUILD

次は”build”です。”〜/esp/hello_world/”に、”CMakeLists.txt”というCmake用と思われるファイルが有ります。その中身を見ると以下の様になっていました。

コメントの箇所に”Cmakeが正しく動く為に設定しているファイルです。”と有ります。そして書かれているのは下記の3つです。

  • cmake_minimum_required(VERSION 3.5) ー> コンパイルに必要なバージョン
  • include($ENV{IDF_PATH}/tools/cmake/project.cmake) ー> インクルードパスの指定
  • project(hello_world) ー> プロジェクト名の指定

Buildする前にソースファイルの中身を確認。

意外と色々書かれていますが単純に”Hello wolrd!”とのみ画面に表示するプログラムに変更して保存しました。

これをコンパイルして実行。結果をモニターに表示。

  • プログラムのコンパイル ー> ”idf.py build”
  • ESP32へ書き込みと実行 ー> ”idf.py flash”
  • 結果表示 ー> ”idf.py monitor”

モニターに以下が表示されます。


@G500:~/esp/hello_world$ idf.py monitor
Executing action: monitor
Serial port /dev/ttyACM0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting......
Detecting chip type... ESP32
Running idf_monitor in directory /home/kita_note/esp/hello_world
Executing "/home/kita_note/.espressif/python_env/idf5.0_py3.8_env/bin/python /home/kita_note/esp/esp-idf/tools/idf_monitor.py -p /dev/ttyACM0 -b 115200 --toolchain-prefix xtensa-esp32-elf- --target esp32 --revision 0 /home/kita_note/esp/hello_world/build/hello_world.elf -m '/home/kita_note/.espressif/python_env/idf5.0_py3.8_env/bin/python' '/home/kita_note/esp/esp-idf/tools/idf.py'"...
--- idf_monitor on /dev/ttyACM0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6752
load:0x40078000,len:14796
load:0x40080400,len:3792
0x40080400: _init at ??:?

entry 0x40080694
I (27) boot: ESP-IDF v5.0-dev-1599-gb66cc63c41 2nd stage bootloader
I (27) boot: compile time 08:15:05
I (27) boot: chip revision: 1
I (31) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (38) boot.esp32: SPI Speed      : 40MHz
I (43) boot.esp32: SPI Mode       : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label            Usage          Type ST Offset   Length
I (68) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (76) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (83) boot:  2 factory          factory app      00 00 00010000 00100000
I (91) boot: End of partition table
I (95) boot_comm: chip revision: 1, min. application chip revision: 0
I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=07754h ( 30548) map
I (122) esp_image: segment 1: paddr=0001777c vaddr=3ffb0000 size=0243ch (  9276) load
I (126) esp_image: segment 2: paddr=00019bc0 vaddr=40080000 size=06458h ( 25688) load
I (140) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=1487ch ( 84092) map
I (171) esp_image: segment 4: paddr=000348a4 vaddr=40086458 size=04d08h ( 19720) load
I (179) esp_image: segment 5: paddr=000395b4 vaddr=50000000 size=00010h (    16) load
I (185) boot: Loaded app from partition at offset 0x10000
I (185) boot: Disabling RNG early entropy source...
I (200) cpu_start: Pro cpu up.
I (200) cpu_start: Starting app cpu, entry point is 0x40081000
0x40081000: call_start_cpu1 at /home/kita_note/esp/esp-idf/components/esp_system/port/cpu_start.c:152

I (0) cpu_start: App cpu up.
I (214) cpu_start: Pro cpu start user code
I (214) cpu_start: cpu freq: 160000000 Hz
I (214) cpu_start: Application information:
I (219) cpu_start: Project name:     hello_world
I (224) cpu_start: App version:      1
I (229) cpu_start: Compile time:     Feb 27 2022 08:14:54
I (235) cpu_start: ELF file SHA256:  213d12f4f57abe86...
I (241) cpu_start: ESP-IDF:          v5.0-dev-1599-gb66cc63c41
I (247) heap_init: Initializing. RAM available for dynamic allocation:
I (254) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (260) heap_init: At 3FFB2D30 len 0002D2D0 (180 KiB): DRAM
I (267) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (273) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (279) heap_init: At 4008B160 len 00014EA0 (83 KiB): IRAM
I (287) spi_flash: detected chip: generic
I (290) spi_flash: flash io: dio
W (294) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (308) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!

2行目に:Executing action: monitor 3行目に:Serial port /dev/ttyACM0 4行目に:Connecting…. 最後の行に、”Hello world!” と確かに表示されています。モニターに表示したかったのは最後の1行だけなのに。

また、”Ctrl + ]” でモニターから抜けれます。

流れは分かったつもりですが

ここまでの流れをまとめると、以下の様になると思います。

  1. ターミナルを上げる
  2. パスの設定を行う。”. $HOME/esp/esp-idf/export.sh”
  3. プロジェクト(関係するファイルを保持しているフォルダ)への移動。今回は:”cd ~/esp/hello_world”
  4. 開発CPUの指定。”idf.py set-target esp32”(初回の一回のみ)
  5. CPUの詳細を設定。”idf.py menuconfig” ー> ”sdkconfig”ファイルが作成される。
  6. ビルド。”idf.py build”
  7. 書き込み。”idf.py flash” (-p PortでUSBポート指定できる)
  8. 結果表示。”idf.py monitor” (”Ctrl + ]” でモニターから抜ける)

試しに以下の作業を行って見ました。

  1. “hello_world”フォルダーを削除
  2. サンプルディレクトリから新たに”hello_world”をコピー
  3. ターミナルを立ち上げて”hello_world”フォルダーに移動
  4. パスの指定を行う。
  5. main フォルダにある、hello_world_main.c をprintf(“Hello world!\n”);のみにして保存
  6. ここで、”idf.py set-target esp32”、”idf.py menuconfig”を行わずにいきなりビルドする。

予想はビルドエラーでしたが、なんとエラー無しに終了しました。フォルダを確認すると”sdkconfig”ファイル、”build”フォルダーが作成されていました。”idf.py set-target esp32”を行わない場合は、ESP32用の”sdkconfig”ファイルが自動的に作成されるのでしょうか。この後、”idf.py flash”、”idf.py monitor” と行ったのですが問題無く実行出来ました。

次回は

まだESP-IDFでの流れを十分に理解出来ていません。次回は新規プロダクトの作成をやってみる予定です。