SNSへはこちら

ESP8266でベアメタル(5) - NonOS SDKについて整理

前回お話したとおり、NonOS SDK に甘んじて開発を行う方針となりましたので、ひとまず利用法と仕様について整理します。

NonOS SDKの準備

この SDK は GitHub の repo として公開されていますので、取り敢えず master を使っていこうと思います。バグ踏むの怖いけど、僕は master を常に使う主義。

$ git clone https://github.com/espressif/ESP8266_NONOS_SDK

そうしたら SDK ディレクトリのルートに入って、example をコピーしてきます。なお examples に入ったままビルドを行おうとしても失敗しますので必ずコピーしてから使ってください。以下では一番単純な peripheral_test というプロジェクトを用います。

$ cp -r examples/peripheral_test/ .

NonOS SDK の仕様

ただ使うだけだったらソースコードを改変するだけなのですが、今回は理解を深めるために NonOS SDK の特徴的な仕様について調べ、記していきます。

パーティションテーブル

いきなり謎のものが出てきました。正直初めて見たときは若干吐き気がしたものです(笑)。このわけのわからないものは、documents/EN にて説明が書いてあります。

...うん、読んでも必要性がわからんわ
ひとまず、Wi-Fi 用の各種パラメータ等のアドレス指定が必要のようですね。しらんけど。用途不明ですが、最低限これで行けるようです。

なお、Wi-Fi の無線を使わない場合はそもそもこのパーティションテーブルさえ不要です

#define SYSTEM_PARTITION_RF_CAL_ADDR                       0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR                     0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR             0x3fd000

static const partition_item_t at_partition_table[] = {
    { SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
    { SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
    { SYSTEM_PARTITION_SYSTEM_PARAMETER,SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
};

書き込むべきバイナリ

ビルドが終わったら書き込みます。有能な esptool.py さんのおかげで、引数指定も直感的に、楽にすみます。
バイナリ書き込みコマンドはこちら。

$ esptool.py --baud 1152000 write_flash 0x0 ../bin/eagle.flash.bin 0x3FC000 ../bin/esp_init_data_default_v05.bin 0x3FE000 ../bin/blank.bin 0x10000 ../bin/eagle.irom0text.bin

初期化関数

この SDK を動かすために初期化関数が必要です。どういう物が必要かは決められており、おおむね次のような感じです。

void user_pre_init(void)
{
    if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
        os_printf("system_partition_table_regist fail\r\n");
        while(1);
    }
}

void
user_init(void)
{
}

user_pre_init は主にパーティションテーブルの登録用にある関数。無線通信を実装したい場合は必須。
user_init は割り込み関数の登録など、各種動作やペリフェラルの初期化に必要なもの。ここでユーザーは自由に設定を行います。なお main 関数はいじれない。

ビルドの自動化

ビルド時にいちいち数字を入力するのだるいですよね??持っているデバイスは ESP-WROOM-02 の 4MB 版で固定ですので(2MB 版は多分違って、FLASH_TYPE を 5 にする必要がある?)、入力するパラメータは変わるはずがありません。では自動化しましょう。

./gen_misc.sh でダルい原因は対話的な入力です。これによって Enter キーを強打することによる気持ちの良いビルドができなくなっています。
そもそも各ステップで入力される値は、STEP 6 以外デフォルト値(Enter を押すだけ)であることに注意すると、expect コマンドを用いて、実行スクリプトが以下のように書けます。

#!/usr/bin/expect
set FLASH_TYPE "6"

set timeout 5

spawn ./gen_misc.sh

expect {
    "STEP 1" {
        send "\n"
        exp_continue
    }
    "STEP 2" {
        send "\n"
        exp_continue
    }
    "STEP 3" {
        send "\n"
        exp_continue
    }
    "STEP 4" {
        send "\n"
        exp_continue
    }
    "STEP 5" {
        send "${FLASH_TYPE}\n"
    }
}

expect {
    "\\\$" {
        exit 0
        }
}

参考はこちらexpect コマンドを用いました。

シェルスクリプトやっててよかった〜〜〜!!そう思う瞬間でした。速攻でビルドが終わります。