ESP8266_RTOS_SDK V3を使ってみる

環境構築


ESP8266では2つのRTOSを利用することができます。
1つはこちらで紹介しているesp-open- rtosです。
今回はEspressifが提供しているESP8266_RTOS_SDKを紹介します。

ESP8266_RTOS_SDKはこちらのページから ダウンロードすることができます。
ReadMeのRoadMapには以下の様に記載されています。
Google君に翻訳してもらいました

出展:https://github.com/espressif/ESP8266_RTOS_SDK

ESP8266_RTOS_SDKのフレームワークはかなり古く、現在のesp-idfとは異なります。
最終的にv2.0.0以降は ESP8266_RTOS_SDKをesp-idfに移行する予定です。
ただし、当分の間esp-idfによってマルチCPUアーキテクチャがサポートされていないため、
回避策として、まずESP 8266 SDK(ESP 8266_RTOS_SDK v3.0)の新しいバージョンを提供します。
ESP8266_RTOS_SDK v3.0に対して実行されるアクションは、次のとおりです。
1.フレームワークをesp-idfスタイルに変更します。
2.Wi-Fiライブラリとlibmainを含むいくつかのコアライブラリを再構築する
3. FreeRTOS、lwIP、mbedTLS、noPoll、libcoap、SPIFFS、cJSON、wolfSSLなどを含むサードパーティ製ライ ブラリをいくつか更新します。
4.いくつかのドライバを更新する
5.その他



esp-idfはESP32の標準開発環境です。
最終的にはマルチCPUアーキテクチャ(要するにESP8266とESP32)をサポートし て、
ESP8266もESP32も、同じ環境で開発できるようになるのかもしれませんが、
esp-idfはesp32、esp32-s2、esp32-c3など、サポートする範囲をどんどん広げているので
ESP8266とESP32の開発環境を統合するのは難しいと思います。

フレームワークがesp-idfスタイルに変更されているので、V2とは全く違うのかもしれませんが、V2を使ったことが無いので違いが分かりま せん。
ESP8266_RTOS_SDK V3を使うと、どのようなことができるのか紹介していきます。
今回使用したプラットフォームはCore-i3で動くDebian 11です。



まずはtoolchainのインストールです。
ESP8266(Xtensa LX106)のtoolchainとしてesp_open_sdkを使います。

esp-open-sdkの入手方法はこちらで 紹介しています。
今回はESP8266_RTOS_SDKに付属のPreBuildバイナリを使いました。

次にsdkが使用するツールをインストールします。
aptでインストールされるpipは古いバージョンなので、インストール後は直ぐにアップデートします。
$ python3 --version
Python 3.9.2

$ sudo apt install python3-pip git build-essential flex bison gperf libncurses-dev

$ python3 -m pip --version
pip 20.3.4 from /usr/lib/python3/dist-packages/pip (python 3.9)

$ python3 -m pip install --upgrade pip

$ python3 -m pip --version
pip 22.3 from /home/nop/.local/lib/python3.9/site-packages/pip (python 3.9)

この時点で、アカウントにUSBポートのアクセス権を与えておきます。
これをしないと、ファームの書き込み時にパーミッションのエラーとなります。
ESP8266をUSB経由でホストマシンに接続すると、USBポートを所有しているグループが分かります。
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0  2月 10 08:50 /dev/ttyUSB0

$ sudo usermod -a -G dialout ログインユーザ名

一旦ログアウトして再ログインすると、設定が有効になります。



次にESP8266-RTOS-SDKをインストールします。
$HOME/espの下にインストールしている例が多いのですが、私は$HOMEの直下にインストールしました。
$ cd $HOME

$ git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
Cloning into 'ESP8266_RTOS_SDK'...
remote: Enumerating objects: 335, done.
remote: Counting objects: 100% (335/335), done.
remote: Compressing objects: 100% (223/223), done.
remote: Total 15407 (delta 139), reused 218 (delta 100), pack-reused 15072
Receiving objects: 100% (15407/15407), 39.55 MiB | 4.44 MiB/s, done.
Resolving deltas: 100% (8144/8144), done.

$ ls ESP8266_RTOS_SDK/
CMakeLists.txt  SUPPORT_POLICY_CN.md  docs        make
Kconfig         SUPPORT_POLICY_EN.md  examples    requirements.txt
LICENSE         add_path.sh           export.sh   sdkconfig.rename
README.md       components            install.sh  tools

次に以下のコマンドでIDF_PATHの環境変数を設定し、環境変数を有効にします。
この環境変数をだれがどのように使うのかは追って紹介します。
$ echo 'export IDF_PATH=$HOME/ESP8266_RTOS_SDK' >> ~/.profile

$ source .profile

以下のコマンドでビルド時に使用するPython関連のツールをインストールします。
$ python3 -m pip install --user -r $HOME/ESP8266_RTOS_SDK/requirements.txt

この環境はpythonコマンドが必須になっています。
最近のDistributionにはpython(python2)がインストールされていません。
そこで、以下の手順でpythonへのリンクを作成します。
$ python --version
-bash: python: コマンドが見つかりません

$ ls -al /usr/bin/python*
lrwxrwxrwx 1 root root       9  4月  5  2021 /usr/bin/python3 -> python3.9
-rwxr-xr-x 1 root root 5479736  3月  1  2021 /usr/bin/python3.9

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1
update-alternatives: /usr/bin/python (python) を提供するために自動モードで /usr/bin/python3.9 を使います

$ python --version
Python 3.9.2



ESP8266_RTOS_SDK/examplesディレクトリには多数のサンプルソースが含まれています。
動作確認のために、ESP8266_RTOS_SDK/examples/get-started/hello_worldをビルドします。
ESP8266_RTOS_SDK(esp-idf環境)では以下のメニューを使ってプロジェクトごとの設定を行うことができます。


hello_worldのサンプルをビルドする場合、何も変更する必要はなく、そのまま< Exit >で構いません。
新しいコンフィグを有効にするかどうか聞かれるので< Yes >で抜けます。


カレント・ディレクトリにsdkconfigが作られます。
sdkconfigは普通のテキストファイルでviやcatで見ることができます。
ビルドはこのファイルの定義に従って行われます。
ビルド条件を変えるときは、make menuconfig を実行するか、あるいは直接sdkconfigファイルを編集します。



ファームの書き込みとシリアルモニターの起動は以下のコマンドで行います。
$ make flash monitor

ファームの書き込み時に、使用する開発ボードによっては以下のエラーとなる事が有ります。
どうもArduino環境を使ってファームを書き込んだことが有るボードだとこのエラーになるようです。
$ make flash
Toolchain path: /home/nop/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc
Toolchain version: esp-2020r3-49-gd5524c1
Compiler version: 8.4.0
Python requirements from /home/nop/ESP8266_RTOS_SDK/requirements.txt are satisfied.
App "hello-world" version: v3.4-43-gd11de779-dirty
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.4.0
Connecting....
Chip is ESP8266EX
Features: WiFi
MAC: 2c:f4:32:2d:6d:31
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Compressed 10432 bytes to 7023...

A fatal error occurred: Timed out waiting for packet content
/home/nop/ESP8266_RTOS_SDK/components/esptool_py/Makefile.projbuild:75: recipe for target 'flash' failed
make: *** [flash] Error 2

このエラーとなるときはesptoolを使うと正しく書き込みできるようになります。
とても長いですが、1行のコマンドです。
$ python3 -m pip install esptool

$ python $HOME/.local/bin/esptool.py --chip esp8266 --port /dev/ttyUSB0 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 2MB 0x0 /home/nop/ESP8266_RTOS_SDK/examples/get-started/hello_world/build/bootloader/bootloader.bin 0x10000 /home/nop/ESP8266_RTOS_SDK/examples/get-started/hello_world/build/hello-world.bin 0x8000 $HOME/ESP8266_RTOS_SDK/examples/get-started/hello_world/build/partitions_singleapp.bin

一度でも書き込みが成功すると、次からはmakeで書き込みができるようになります。
Arduino環境が書き込むBootLoaderが関係しているような気がします。

ファームの書き込みが終わると、シリアルモニターが起動し、以下の表示となります。
このプログラムはチップ情報を表示して10秒後に再起動するだけのプログラムです。
シリアルモニタからは Ctrl+] で抜けられます


続く....