2015-10-01 ESP8266 lwip
最近ESP8266をいじってます。Arduinoは中で何やってるかよくわからなくてキモチワルイので、xtensa--gccを使ってC言語です。
なので必然的にespressifが出してるsdkを使うのですが、このsdkがいまいちイケてない…
まず、WiFiやらに繋げるコードを書いてみると、シリアルに意図しない出力が。
どうもsdk libraryの中でprintfしてくれちゃってるようです。勝手にprintfしないでよ。
調べたら system_set_os_print(0) としておけば sdk library の中で printf するのを抑制できるらしいので、入れてみる。
すると今度は user program からの printf (os_printf()) も何も出力しなくなった。おいw
つーかーえーねーーーーーーーー(1つめ)
幸いシリアルのI/O portを直接ドライブするサンプルコードがあったので、オレオレprintfを入れてしまうことで対処。なんだかなあ。
もう一つは、TCPが不安定。telnetでつないで各種ルータやunixマシンのシリアルコンソールに繋げるものを作ったんだけど、
大量に送受信しているとTCPが切れる。tcpdumpで見てみると、ずいぶん変な切れ方をしている。
ESP8266側がtimeoutで切れた時にTCP_RSTを送るのだが、TCPのseqが狂っている。
そのためcilentは無視するので何度も再送ackを送る。ESPは何度もRSTを返す、みたいなことになっている。
糞IPスタックじゃねーか。(2つめ)
そもそもなんで切れるんだよTCPだろ再送しろよと思って調べてたらESP8266のsdkに使われてるlwipのソースがあった http://bbs.espressif.com/viewtopic.php?f=46&t=951 ので
これでliblwipを作りなおしてdebugできるぜと張り切ってデバッグしてみると、切断直前の数秒間にESP側でTCPの再送が走ってる。しかしtcpdumpして見ててもESP側から再送ackを送ってるようには見えない。
やっぱり糞IPスタックじゃねーか。
というわけでちまちまデバッグしてたら、追いかけてった先に #if 1 /* by Snake: resolve the bug of pbuf reuse */ 〜 #endif みたいな修正個所が。
本家 lwip には無い修正で、これのせいじゃねーの? と思って #if 0 にしたらTCP切れる問題は綺麗になおった。
どうも espressif でコメントの内容の事を修正しようとしたがエンバグしちゃったんだろうなぁ。リポジトリ公開してくれてないから経緯がよくわかんないけど。
とりあえず #if 0 にしてもメモリリークとかは起きてない様子なので問題なさげ。
なんで俺はsdkのデバッグをしてるんだろう。
なので必然的にespressifが出してるsdkを使うのですが、このsdkがいまいちイケてない…
まず、WiFiやらに繋げるコードを書いてみると、シリアルに意図しない出力が。
どうもsdk libraryの中でprintfしてくれちゃってるようです。勝手にprintfしないでよ。
調べたら system_set_os_print(0) としておけば sdk library の中で printf するのを抑制できるらしいので、入れてみる。
すると今度は user program からの printf (os_printf()) も何も出力しなくなった。おいw
つーかーえーねーーーーーーーー(1つめ)
幸いシリアルのI/O portを直接ドライブするサンプルコードがあったので、オレオレprintfを入れてしまうことで対処。なんだかなあ。
もう一つは、TCPが不安定。telnetでつないで各種ルータやunixマシンのシリアルコンソールに繋げるものを作ったんだけど、
大量に送受信しているとTCPが切れる。tcpdumpで見てみると、ずいぶん変な切れ方をしている。
ESP8266側がtimeoutで切れた時にTCP_RSTを送るのだが、TCPのseqが狂っている。
そのためcilentは無視するので何度も再送ackを送る。ESPは何度もRSTを返す、みたいなことになっている。
糞IPスタックじゃねーか。(2つめ)
そもそもなんで切れるんだよTCPだろ再送しろよと思って調べてたらESP8266のsdkに使われてるlwipのソースがあった http://bbs.espressif.com/viewtopic.php?f=46&t=951 ので
これでliblwipを作りなおしてdebugできるぜと張り切ってデバッグしてみると、切断直前の数秒間にESP側でTCPの再送が走ってる。しかしtcpdumpして見ててもESP側から再送ackを送ってるようには見えない。
やっぱり糞IPスタックじゃねーか。
というわけでちまちまデバッグしてたら、追いかけてった先に #if 1 /* by Snake: resolve the bug of pbuf reuse */ 〜 #endif みたいな修正個所が。
本家 lwip には無い修正で、これのせいじゃねーの? と思って #if 0 にしたらTCP切れる問題は綺麗になおった。
どうも espressif でコメントの内容の事を修正しようとしたがエンバグしちゃったんだろうなぁ。リポジトリ公開してくれてないから経緯がよくわかんないけど。
とりあえず #if 0 にしてもメモリリークとかは起きてない様子なので問題なさげ。
なんで俺はsdkのデバッグをしてるんだろう。
EOF