chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Dockerで組み込みRust 開発環境を作る(espup版)

要約:前回はespupを入れずに環境を構築した。が、、espdemo等のビルド手順等では「espupでターゲットを切り替えろ」等と書かれいる
取り組み:前回のDockerファイルをベースに、espup版のイメージを作る

FROM debian:bullseye-slim
RUN apt-get update \
  && apt-get install --yes curl \
  && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup-init.sh \
  && chmod +x /tmp/rustup-init.sh \
  && /tmp/rustup-init.sh -y \
  && . "$HOME/.cargo/env" \
  && rm /tmp/rustup-init.sh
RUN apt-get install --yes clang  python3 python3-pip git pkg-config  libudev-dev libssl-dev \
  && python3 -m pip install pip --upgrade
RUN . "$HOME/.cargo/env" \
  && cargo install espup \
  && cargo install ldproxy \
  && cargo install cargo-generate \
  && cargo install espflash \
  && cargo install cargo-espflash \
  && espup install

RUN . "$HOME/.cargo/env" \
  && . "$HOME/export-esp.sh"

RUN mkdir /app

後半のenv読み込みは効果ないとは思います(コンテナを使う時にenv読み込みを忘れないため)

docker run --volume /home/rustbld00/lang/rust:/app  --device=/dev/ttyACM0:/dev/ttyACM0  -it rust_buld_espup:0.2  /bin/bash

Rust(ESP32) のstd demoをビルドしてみる

git clone https://github.com/ivmarkov/rust-esp32-std-demo
. ./export-esp.sh
rustup default esp
cd rust-esp32-std-demo/
cargo build

環境設定が不足していると怒られるので対応

export RUST_ESP32_STD_DEMO_WIFI_SSID=<wifi_SSID>
export RUST_ESP32_STD_DEMO_WIFI_PASS=<wifi_password>

ビルドが通ってFlashに焼く

espflash flash target/riscv32imc-esp-espidf/debug/rust-esp32-std-demo

焼き終わったが、espflash monitor等ではシリアル通信が正しく行えないようなのだが。。
以下のように、waiting for downloadで待ちが発生

root@e51a2bfcc424:/app/rust-esp32-std-demo# espflash monitor
✔ Use serial port '/dev/ttyACM0'? · yes
[2023-07-09T12:53:43Z INFO ] Serial port: '/dev/ttyACM0'
[2023-07-09T12:53:43Z INFO ] Connecting...
[2023-07-09T12:53:43Z INFO ] Using flash stub
Commands:
    CTRL+R    Reset chip
    CTRL+C    Exit

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x7 (DOWNLOAD(USB/UART0/1))
Saved PC:0x40380832
waiting for download

本件は以下に答えがありそうだ・・・
ESP32-C3 Stuck waiting for download - ESP32 Forum
上記のQAは、idf.py というツールを使った時の問題であった。
このツールを使った場合に、ESP32側がダウンロードモードに推移してしまう問題が発生しているとのことで、今回もESP32側がダウンロードモードに推移しため、ESP32側はダウンロードを待ち、espflash側はESP32からのシリアル出力を待つという、両方で待ち合いになってロックしたような状況と理解しました。
何か起動オプションがあれば、ダウンロードモードに推移するのを防げるかもしれません。

espflashのmonitor部のソースは以下。
espflash/espflash/src/cli/monitor/mod.rs at main · esp-rs/espflash · GitHub
espflash/src/cli/monitor/mod.rs
これを読むと、Ctrl-Rの時は、Reset後Flash書き込みのようであった。CI/CDを考えて、何度も焼いてテストすることを想定しているのか。
普通に起動するとシリアルから読み込み続けるのだろうけど、何も表示されないというのがなぜなのか・・・

                        KeyCode::Char('r') => {
                            reset_after_flash(&mut serial, pid)?;
                            continue;
                        }

古いバージョンのespflash + RustBoard + デモプログラムの組み合わせで、シリアルデータを受け取れるか確認
下記の通り、Flash書き込み待ちに入る

$ espflash --version
New version of espflash is available: v2.0.0

espflash 1.7.0
$ espflash serial-monitor
New version of espflash is available: v2.0.0

Serial port: /dev/ttyACM0
Connecting...

Commands:
    CTRL+R    Reset chip
    CTRL+C    Exit

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x7 (DOWNLOAD(USB/UART0/1))
Saved PC:0x4004c976
waiting for download

別のボード+古いespflash(ホスト環境)+別のプログラムの組み合わせはOK

$ espflash serial-monitor
New version of espflash is available: v2.0.0

Serial port: /dev/ttyACM0
Connecting...

Commands:
    CTRL+R    Reset chip
    CTRL+C    Exit

ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd6100,len:0x172c
load:0x403ce000,len:0x928
load:0x403d0000,len:0x2ce0
entry 0x403ce000
I (30) boot: ESP-IDF v4.4-dev-2825-gb63ec47238 2nd stage bootloader
I (30) boot: compile time 12:10:40

別のボード+新しいespflash(コンテナ内)+別のプログラムの組み合わせはOK

ボードに関連しているのでは?と思えて、USBがESP32に直収か、USB/Serial変換ICを経由してESP32に接続しているか?に関係するだろうか。。
今後やるとしたら以下

  • ボードの種類を変えて動作を確認
  • Flashに焼くプログラムの種類を変えて動作を確認

■参考URL
https://github.com/ivmarkov/rust-esp32-std-demo