2015/12/27

[esp8266]ESP8266_RTOS_SDKのexamplesをcygwinでビルド (1)

はあ、またBLEとESP8266が混在してしまった。。。

ESP8266をArduino上でビルドしたり焼いたりする環境を作ったが、RTOSもいいよ、という記事を読んだ。
Espressifが出した環境で使えるようにしておいた方が無難か、という気持ちもあり、とりあえずサンプルソースだけでもビルドしてみようとした。

うちは、Windows7 64bit + cygwin 32bitだ。


githubのespressif/ESP8266_RTOS_SDKからcloneする。
ここのREADMEにWindowsでビルドできるような感じで書かれていたのでコマンドプロンプトでやっていたのだが、Makefileでincludeするときにパスをどう書くのかわからなくなってきたので、cygwinでやることにしたのだ。

環境変数のSDK_PATHとBIN_PATHを指定する。
これは、gen_misc.shの中にある。
あるのだけど、ビルドの最後の方でpythonを呼び出し、そこからESP8266用のNMコマンドを呼び出そうとしている。
xtensa-lx106-elf-nmを呼び出すのだが、パス無しで書いてあるのでPATHに書いておくくらいしかやり方がわからんかった。

そしてまた、Windowsで動くESP8266用のGCCをインストールせんといかんのだが、Arduino環境を作るときにインストールしてくれているようなので、それを使うことにした。

cygwinでパスを書くとき、ドライブを指定する「c:/」みたいな書き方もできるし「/cygdrive/c/」みたいな書き方もできる。
でも、PATHに追加すると区切りが「:」なので、前者の形式で書いておくと都合が悪い。
しかしそちらに合わせておくと、gccがインクルードパスの解決をうまくやってくれなかった。

そういう、もろもろの事情があって、gen_misc.shの最初はこういう感じになった。

export SDK_PATH="e:/Prog/esp8622/ESP8266_RTOS_SDK"
export BIN_PATH="/cygdrive/c/Users/xxx/AppData/Local/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/bin"
export PATH=$BIN_PATH:$PATH

ここでPATHをやってるけど、結局これをコンソールで実行しているので、実は意味が無いかも。
ただ、ここに書いておくと、これをコピーして、コンソールにぺたっと貼り付ければ済むので、ついでに書いているのだ。

 

makeも、引数がいろいろ付けるのだが、毎回打ち込むのもめんどくさい。
なので、$inputがY以外のときに、こういう行を追加した。

make BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=6

APPの指定は、実はどれがいいかよくわかってない。
前回調べたとき、FOTAで更新するときにはUSER1とUSER2をそれぞれ作るイメージだったので、まずはUSER1を作ろうとしている。
SIZE_MAPが6なのは、うちにあるESP8266モジュールのSPI-FLASHが4MBだからだ。

 

これでコンパイルが進むのだが、リンクで怒られた。
libhal.aがない、ということだ。
よくわからないが、検索するとesp8266-Arduinoのgithubにバイナリがあったので、何も考えずにダウンロードしてlibに置いた。

 

解決しても、次もリンクエラーだ。
.irom0.textがフィットしないとか、そんなエラー。
検索すると、リンカスクリプトの変更がいるみたいだ。
デフォルトでは$(SDK_PATH)/ld/eagle.app.v6.ldを使うのだけど、これはSPI-FLASHが512KB用の設定になっているみたい。
なので、これを4096KB用の設定にすればいいのだが、サンプルでは2048KB用までしかない。

とはいえ、前回IOT_SDK_User_Manual v1.4でも4096KBは(1024KB+1024KB)という扱いだった。
前半にUSER1とUSER2を詰めて、残りはシステムパラメータ以外なら好きに使ってよいというスタンス。
なので、eagle.app.v6.new.2048.ldをコピーして、eagle.app.v6.ldにリネームしておく。

 

それで進むようになったのだが、今度はpythonスクリプトで「no entry point!!」とか言われる。
スクリプトを読むと、eagle.app.symの中からcall_user_startを探しているようだ。
ないのかと思ったが、テキストエディタで開くと見つかる。
ということは、この正規表現がcygwinだとうまく動かんということか。。

p = re.compile('(\w*)(\sT\s)(call_user_start)$')

行末が「call_user_start」になっているところを探しているのだが、cygwinでコンパイルしているためSYMファイルがCR/LFで改行しているため、これにひっかからないみたい。

p = re.compile('(\w*)(\sT\s)(call_user_start).*$')

これだったら、call_user_startの後ろに1文字あってもなくてもよいのかな?
でも、call_user_start1にもヒットしてしまいそうだ。

p = re.compile('(\w*)(\sT\s)(call_user_start)(\r*)$')

こんなのの方が良いのかも。

 

ここまでやると、こういう出力が出て、終わった。

bin crc: 70347e4
Support boot_v1.4 and +
Generate user1.4096.new.6.bin successully in BIN_PATH
boot.bin------------>0x00000
user1.4096.new.6.bin--->0x01000
!!!

 

今回ビルドしたサンプルはwebsocket_demoという名前なのだが、はて、いったい何が動くのだろうね?
続きは次回だ!

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。