リブログなどで記事の大半をコピーして別サイトに載せる場合は、元記事のURLを載せてください

2016/02/09

[ai]『深層学習』の8章に挫折してCNTKを試す (4)

PCが復旧したので、Simple2dサンプルを動かしてみた。

ログがだーっと出るので、ファイルに保存したい。
リダイレクトしようかと思ったが、標準出力か標準エラー出力かわからんし、混ぜた方が良いのか片方だけがよいのかわからん。

検索すると、stderrというオプションを付けると、そこに書込むらしい。

> cntk configFile=Config/Simple.config currentDirectory=Data stderr=.\log

こうすると、Dataフォルダの中に「log_Simple_Demo_Train_Simple_Demo_Test.log」というファイルができた。
logというフォルダまで作ってやったのに、Dataフォルダの直下にこのファイルができていたのだ。
currentDirectoryでデータフォルダの場所を指定してるけど、これはconfigファイルに書いているパスがそうなっているからだろうか。

細かいことだが、今のgithubに上がっている設定ファイルは、Simple.configではなくSimple.cntkになっている。
「CNTKBook-20160121.pdf」という説明っぽいファイルもconfigになっているので、注意しよう。
まあ、エラーが出るだけなんだけど。

 

ログの見方はよくわからんが、最初の半分くらいはSimple.configの中身を展開したもののようだ。
なんというか、コンパイル前のプリプロセスみたいな感じで、デフォルト値などが見えるようになったのかもしれない。
「>>>>>>>>>」がセクションの開始で、「<<<<<<<<<<」が終わりなのだろう。

  • RAW CONFIG (VARIABLES NOT RESOLVED
  • RAW CONFIG WITH ALL VARIABLES RESOLVED
  • PROCESSED CONFIG WITH ALL VARIABLES RESOLVED

ここまでが展開部分かな。
「SimpleNetworkBuilder Using CPU」などと出ているから、あれだけ苦労してインストールしたCUDAを使ってくれていないということか。
configファイルに「deviceId = -1」という行があり、コメントに「-1だとCPU」と書いてあるから、そうなのだろう。
”auto”とかにしておけば、勝手に使ってくれるのかもしれない。

ここから先は「Validating」のログがわーっと書いてあるのだが、さっぱりわからん。
一番最後に、結果らしきものがあるのだけど・・・これも見方がわからん。
「レコードが603見つかった」とあり、DataTest.txtも603行だから、これはそうなのだろう。

Minibatch[1-1]: Samples Seen = 603    EvalErrorPrediction: ErrorPrediction/Sample = 0.04145937    CrossEntropyWithSoftmax: CrossEntropyWithSoftmax/Sample = 0.096707169   

Final Results: Minibatch[1-1]: Samples Seen = 603    EvalErrorPrediction: ErrorPrediction/Sample = 0.04145937    CrossEntropyWithSoftmax: CrossEntropyWithSoftmax/Sample = 0.096707169    Perplexity = 1.1015378   

まだブログエディタが整ってなくて、こういうログが載せづらい。。。
Final Results、とわざわざ書いてあるから、下の方が最終結果なのだろう。
これが、0.99とかそういう値があったら「あ、99%は正解してるんだ」などと想像できるのだけど、0.04とか0.09、1.10とかになるとそういう意味じゃないんだろう、くらいはわかる。
あー、でも誤認識が9.6%とかだったら、まだわかるかも。

きっと、境界線付近の座標は正解率が悪くて、離れていくほど高くなっていくに違いない。
・・・とロジックで組んでるのだったら思うのだけど、どうなのかな?

https://github.com/Microsoft/CNTK/blob/master/Examples/Other/Simple2d/AdditionalFiles/SimpleDemoOutputReference.png

この画像が、たぶん結果をグラフにしたものなのだろうけど、色見本の見方がわからん。
+25~-30くらいだけど、単位がないとねぇ。

画像はさっきのPDFのFigure 1.2と同じもの。
「Trained output values over the region of interest for the first (of two) output neurons」
「ROIをトレーニングした出力値」というのはなんとなくわからんでもないが、「最初の2つのニューロンの出力」は何だろう?
”output neurons”は、出力ノードのことか?
文章の方に「optimized output (before sigmoid) of one of the two output nodes」とあるから、そういう気がする。

 

が、今日はもう寝よう。

2016/02/07

[ai]『深層学習』の8章に挫折してCNTKを試す (3)

Simple2dがどういうサンプルなのか気になってきた・・・。
まだメインPCのバックアップ処理などやっているので、調査を続けておこう。

https://github.com/Microsoft/CNTK/blob/master/Examples/Other/Simple2d/Config/Simple.cntk
L.29~30にこういうコメントがある。

# Notation xxx:yyy*n:zzz is equivalent to xxx, then yyy repeated n times, then zzz
# Example: 10:20*3:5 is equivalent to 10:20:20:20:5

???

xxx = 10
yyy = 20
n = 3
zzz = 5

というのは、わかる。
「xxx:yyy*n:zzz」が「xxx, then yyy repeated n times, then zzz」というのもわかる。
「10:20*3:zzz」が「10:20:20:20:5」というのまでわかる。
しかし、この「10:20:20:20:5」って、なんだ?
これがSimple2dなのか??

 

そういえば、AdditionalFilesにMATLABのファイルがある。
https://github.com/Microsoft/CNTK/blob/master/Examples/Other/Simple2d/AdditionalFiles/MakeData.m
これで訓練データなりテストデータなりを作成しているようだ。

L.27にファイル出力部分があり、3列のうちの最初2つが(x, y)座標、3列目がlabelになっている。
座標(x, y)の値は-1.0~+1.0の乱数。
labelはsin波を元にしていて、imageという式らしい。
Excelで左辺をグラフにした。

image

この線よりyが下にあれば条件を満たす。
例えばx=0のとき、yが0より小さければ真、0以上なら偽となる。
yが-0.25より小さければ必ず真だし、yが+0.25以上ならば必ず偽だ。
まあ、左右対称だから、確率として半々なのかな。
たぶん、真=1、偽=0というラベルだろう。

こういう式で表せるものは、当然ロジックで評価できて、結果も100%にできる。
だから、機械学習の結果を判断しやすいのだろう。

 

ああ、そういえばこの式とコメントの関係はわからないままだ。
たぶん、データについてのコメントじゃなくて、ネットワークについてのコメントなんだろう。
だから、まだわからなくて大丈夫だ。

[ai]『深層学習』の8章に挫折してCNTKを試す (2)

今日はメインPCの復旧処理をやっているので、今回はCNTKについて調べるだけだ。

前回、MicrosoftのCNTKを入れてみて、CaffeでやったことのあるMNISTのサンプルがあったので動かして、「で?」で終わってしまった。
CNTKのインストールで注意するところだけわかった。

  • WindowsかLinux
  • どちらも64bitのみ
  • Windowsは、ビルドするなら英語localeがよいらしい(試してない)
  • [win]ビルド済みを使うなら、CUDAバージョンはファイル名を見よう


前回わからなかった、あの実行結果をどうしてよいのかを調べたい。
ただ、何をキーワードにしてよいのかもわからない。。。

日本語でCNTKを動かしている人を探していると、ようやく見つかった。
CNTKのチュートリアル(MNIST)の読み解きに挑戦 - FPGA開発日記
そうそう、こういう「使ってみました」を探していたんです。

この方も「全然面白くないよ!」と書かれているから、やり方は間違ってなかったようだ。
ただ、結果はlogファイルに入ってたんだな・・・気付かなかった。
いまはPCが使えないので、あとで見ることにする。

そして、Simple2dのように出力を出すように変更なされてる。
Wikiにも一番上にあったのだが、Others/Simple2dと「その他」みたいな扱いだったのでスルーしたのだ。
順番にも意味があったのか・・・。


Simped2dサンプル

MNISTはpythonでデータ取得から始めていたが、Simple2dのデータは既にDataフォルダに入っているとのこと。
見てみると、txtファイルが3つある。
SimpleDataTest.txtとSimpleDataTrain.txtは3列のデータがだーっと入っている。
SimpleMapping.txtは、0と1と書いてある行があるだけ。

Trainは訓練用、Testは評価用だろう。
3列のデータも、(x, y) = z、みたいなことじゃなかろうか。
本来は、Test.txtの3列目はないのだろうけど、正答率を計算するために付いてるだけだと思う。
だって、ニューラルネットだろうとなんだろうと、自分が判定した結果が正しかったかどうかを自分で知る方法はないのだ。
人間が自分の意見が正しいのかどうかを考えるため他の人の意見を聞くように、誰かに頼るしかない。
そして聞いた中の意見で一番多いものを採用する、くらいしかやりようがない。
「でもやっぱり自分はこう思う!」という意見を貫きにくいだろうな、やつらは。


なので、当たり前だけど、機械学習が正しく学習するためには、正しい結果を教え続ける、少なくとも正しい結果が間違った結果を上回るようにしないといけない。
間違ったことだけ教えていたら、その学習結果は間違った方に進んでしまい、正しい結果を受け入れなくなってくるんじゃなかろうか。

Train.txtは正しい結果という前提の元、Test.txtが評価されることになる。
なので、悪意でTrain.txtが正しくない結果だった場合、Test.txtは正しくない評価をされることになる。
今は、機械学習は「当てにならないもの」という前提の世界だからよいけど、もし機械学習が正しい前提の世界になったら、ロジックで生み出された結果ではないため、混乱するだろうな。
そういう意味では、判定がロジックで評価できるしくみとセットになっていた方が安全だと思う。

いかんいかん、脱線してしまった。
だけど、ロジックで作っていない動作が不安な理由って、制御ができないことだと思う。
もしロジックで作った部分と併用して、機械学習の結果がロジックと異なった場合に拒否させようとしても、ロジックの方が「異なる」と判定できないんじゃなかろうか。
そもそも、ロジックでそういうのが出せないから、機械学習させようとしてるのだと思うし。

今は「よくできましたね~」という子供の成長を見てるようなレベルだからいいけど、盲目的に信用できるくらいになったらそういう心配もしないといかんでしょうな。


脱線続きだ。。。

Simple2dのReadmeでは、Simple.cntkをconfigファイルとして動かすように書かれている。
このconfigファイルが、ニューラルネットのネットワーク構成だろう。
文法はわからんが、以下の3つがある。

  • Simple_Demo_Train
  • Simple_Demo_Test
  • Simple_Demo_Output

これを、L.15のcommandで指定して実行しているのだろう。
Outputはcommandに入ってないから、これは実行されないのかな。

 

SimpleNetworkBuilderがネットワークのテンプレートみたいなものなのかな。
読んでわかる単語は”Sigmoid”くらいだ。
シグモイド関数は、ロジスティック関数とも呼び、活性化関数としてよく使われるもの(『深層学習』p.10)。
活性化関数は、ユニットの出力(『深層学習』p.8)。
コメントに、inputが2つ、50要素の隠れたものが2つ(50シグモイドノードの隠しレイヤーが2つ)、outputが2つ、と書いてある。
隠しレイヤー(hidden layer)は、中間レイヤー(internal layer)のこと(『深層学習』p.12)。

”Softmax”という単語も覚えている。
結果がクラスごとの比率になっていて、「このクラスに属する可能性が一番高い」みたいな目安になる関数だ(『深層学習』p.19)。
円グラフみたいなもんだな。
これがtrainingCriterionだから、訓練時の判断基準ということだろう。

もう1つevalCriterionがあるが、違いは何だろうか?
そのまま訳すと、評価での判断基準となりそうだが、trainingCriterionと同じ気がしてしまう。
https://github.com/Microsoft/CNTK/wiki/Simple-Network-Builder
Simple.cntkでは”ErrorPrediction”が設定してある。
predictionは「予言」だから・・・エラーが起こりますぞ(ムック風)?
値の選択はtrainingCriterionと同じ、と書いてあるが、trainingCriterionの説明にはErrorPredictionは出てきていない。
https://github.com/Microsoft/CNTK/blob/master/Documentation/Documents/Network%20Description%20Language.md#error-prediction
こっちだと、ErrorPrediction()という関数があるように見える。
ということで、さっきのtrainingCriterionでの”CrossEntropyWithSoftmax”も、evelCriterionの”ErrorPrediction”も、関数名が書いてあるだけということか。
Googleで「prediction error」で検索していると「予測誤差法」という言葉が出てきた。
prediction error methodの意味 - 英和辞典 Weblio辞書
『深層学習』p.15に「誤差関数(error function)」とあるから、これと同じ意味だろうか。

 

もう1つ、SGDというものがある。
インストールするときに別途やらんといかんかったやつだ(1-bit SGD)。
Stochastic Gradient Descentの略。
確率的勾配降下法 - 機械学習の「朱鷺の杜Wiki」
これは『深層学習』p.23で章を割いてまで説明してあるやつだ。
順伝播型ネットワークの教師あり学習の方法の1つで、ディープラーニングでよく使われているらしい。
パラメータを見てもわからんが、minibatchは『深層学習』p.26に出てくる。
一度に処理すると大変なので小分けしましょう、ということだと思っている。
他のパラメータもPerMBとあるので、MiniBatch単位であれするこれする、ということなのだろう。

 

readerは、TestにもOutputにもあるが、データファイルの読み込みだろう。
TrainではTrain.txt、TestではTest.txt、OutputでもTest.txtを指定している。
前回のMINISTサンプルでは、Output/Modelsに01_OneHidden.xxというファイルが多数できていたが、それはOutputのoutputPathに書くようだ。
50Elementsだから、50ファイルできるのかな?

TestとOutputは、そのoutputPath以外は同じ設定値だ。
L.15のcommandではTraingとTestだけになってるけど、TestをOutputに置き換えるとファイルができるのか。

 

それで、そもそもこのサンプルがどういうものなのかは、先ほどの方が読もうとされている。
CNTKのチュートリアル(Simple2d)の読み解きに挑戦 - FPGA開発日記
CNTKのSimple2dに対して別のデータセットを与えて特徴を掴む(はずが謎が深まる) - FPGA開発日記

まだ私は理解がついて行ってないので、そういうのは次回以降で。。。

2016/02/06

[win][修復]Windows10が立ち上がらなくなったので復旧

うちのメイン環境はWindows7なのだが、そろそろWindows10の準備も進めておこうと思った。
なので、別HDDにWindows10をインストールし、ときどきアップデートなどしている。

  • Windows7のHDD
  • Windows10のHDD
  • ユーザディスク

と3つに分けている。
全部Cドライブに入れてc:\Users以下に入ってしまうと、権利がなくて見えなくなったりすると不便なので、ユーザ用はユーザ用でディスクを分けている。

デフォルトではWindows7のHDDから起動するようになっている。
そのときは、Windows7のHDDがCドライブ、ユーザディスクがEドライブ、Windows10のHDDがFドライブになっていた(と思う。今立ち上がらないので。。)。
Dドライブは、たぶんWindows10インストール時にできる100MBのパーティションだろう。

Windows10を起動するときは、BIOSで起動ドライブを選択するメニューを出し、選択している。


まず、起動しなくなったときの状況から。

いつもは、普通に立ち上がっていた。
最後に行った操作は、OneDriveが起動するのが嫌だったので、gpedit.mscで動かないようにしたのと、OneDriveのフォルダを非表示にしてから、再起動。
そして立ち上げると、すぐに起動できない画面が出てきた。

http://answers.microsoft.com/en-us/windows/forum/windows_10-update/how-to-repair-windows10-file-bootbcd-with-error/3d8f9c4c-365b-4fd3-8dba-9b15eddfb0f7?auth=1
これの、エラーコードが0x0000000Fになったやつだろう。

Windows10のインストールDVDは作っていたので、それで修復すればよかろう、とDVDを突っ込んで、BIOSで起動ドライブでCD-ROMを選択。
なんかそれっぽいのが走り出したので、修復を選んで放置。
2時間しても終わらないので、そのまま寝た。

というのが昨日までの状況。

しかし、あとでわかったことだが、うちのPCは「CD-ROM」を選んでもDVDからは起動しないようだ。
そして、何が立ち上がってあの修復画面になったのかわからないのだが、とりあえずWindows7の修復ディスクが立ち上がっていたようだ。

朝起きると、Windows10はおろか、Windows7も立ち上がらなくなっていた。


Windows10のDVDから正しく起動させ、スタートアップ修復を選ぶも、復旧自体ができない。
見ると、ドライブの中が空っぽ。
Windows10は後回しにして、Windows7の起動を優先させよう。
Windows10のHDDは、外しておく。

 

Windows7の修復ディスクもあったので、そこから起動させてスタートアップ修復しようとしたが、とりあえずこれがDドライブとして認識されている。
bcdboot.exeで修復している人が多いので、とりあえずこう打ってみた。

bcdboot D:\Windows /l ja-JP

エラーにはならない。
ならないが、再起動すると、CI.dllがない、とメッセージが出てすぐに終わる(状態:0xC0000098)。
なんとなくだが、Dドライブとして起動しようとして、CI.dllとかはCドライブにあると思ってるから存在しない、とか、そういう感じだろうか。

ネットでDLL関係を検索すると、胡散臭いのがいっぱい引っかかる。
DLLのみのダウンロードって、信用するのが難しいな。


もう一度、Windows7修復ディスクでコマンドプロンプトを起動。

http://starfleet.if.tv/bkn/log/2010/06/windows7.html
DiskPartというコマンドがあるので、それを見てみる。
list partitionで見ると「*」がついているので、たぶんアクティブパーティションは正しそうだ。

list volumeすると、ユーザディスクがCドライブになっていて、フォーマットが「RAW」になってる。
RAWなのも困るが、Cドライブが占有されるのも困るので、このHDDも取り外す。

再度Windows7修復ディスクを起動すると、今度はCドライブとして見えてくれた。
が、自動修復はエラーのまま。
コマンドプロンプトから、以下を実行。

  • bcdboot c:\Windows /l ja-JP
  • bootrec /fixboot
  • bootrec /fixmbr

ユーザディスクを取り付けて起動させると・・・CI.dllのエラーはまだ出る。
もしかして、本当にCI.dllがないのか?
そもそも、ブートしようとしているから、MBRとかその辺は問題ないはずなのだ。

c:\Windows\System32にはCI.dllはいる。
sfc.exeでチェックしようとしたが、保留中のシステム修復があるので再起動しろと言われる。
修復ディスクにも入っているので、とりあえずそれで置き換えてみよう。

・・・再起動するとCI.dllのエラーは出なくなったが、ブルースクリーンになった。
「PROCESS1_INITIALIZATION_FAILED」。
進んだということは、本当にCI.dllがだめだったということかな?
もしそうなら、CドライブのWindowsフォルダだけバックアップから復元させれば済むのでは。

ひとまず、Windows7修復ディスクの自動修復処理が今までより長く動いているから、放置してみよう。


放置中に、いろいろ考えておこう。

まず、バックアップからの復旧。
うちは、これでバックアップを取っている。
完璧な無料データバックアップソフト - EaseUS Todo Backup Free

このツールだけじゃないのだが、バックアップは取る方よりも復旧させるときの方が大切だ。
めったにやらないから、いざとなって困るので、練習しておいた方がよい。
ネットで探せば出てくるのだが、こういうのは慣れておいた方がよいのだ。

練習していなかった私は、どうやってリストアしてよいのかわからん。
そして、自動復旧処理にやはり失敗したので、リストアしないといけないようだ。
別PCにEaseUSをインストールして、CD-RWにリストア用のブータブルディスクを焼く。


焼いている間に、ユーザディスクの復旧を行う。

gpartsが立ち上がるLive CDを使って、testdiskする。
が・・・testdisk上は正しく見えているのだな、これが。

EaseUSはファイル単位でリストアできると書いてあるのだが、ディスクごとバックアップを取っていたためかファイルの指定ができないようなのだ。
CI.dllだけあればよいのに・・・。

バックアップの仕方も、ディスク丸ごとだけじゃなくて、システムだけバックアップというのもあるから、Windows Updateした後くらいはそれでバックアップを残して置いた方が無難かもしれん。


Windows7のリストアを行う。
ファイル単位ではないのでそこまで時間がかからないかと思ったのだが、差分バックアップを行っていたためか数時間かかりそうだ。


かなりかかったが、1/31のシステムをリストアした。

ATOK2016が入ったくらいで、大きな変更はなかったようだ。
そういえば、ATOK2016が入ったときにはシステムの復元ポイントは作成されていなかったんだな。
これがあると、復元ポイントから戻せて楽だったのだが。

ファイル同期としてはGoogleドライブとDropboxのアプリをインストールしているのだが、Dropboxは特に問題なかったものの、Googleドライブの方はいくつかのファイルが「[競合]」マーク付きでアップロードされてしまった。
データファイルはリストアしていないので、タイムスタンプも内容も変わっていないのだが・・・。
以前のファイルが消されたわけではないから削除すれば済んだのだが、もうちょっとうまくやってもらえると助かる。
スタートアップに入っておくと心配なので、Googleドライブアプリは自動起動から外すことにした。
この手のサービスは便利なんだけど、こういう同期がどうなるかよくわからないときは不安だな。

いくらか古いものはあるかもしれないが、ひとまず落ち着いているようなので、システムの復元ポイントと、バックアップツールでのバックアップをしておく。
これはこれで、かなり時間がかかるだろう。

はい、ここまでで朝9時から18時くらいです。
これからバックアップなので、完了は早くても20時くらいだろうか。
そこまで行ったら、ようやくWindows10の復旧作業だ。


復旧作業2日目。
バックアップは、なぜか99%完了のまま止まっていたので、差分を消して再度作成し直した。
おかげで、2日連続でパソコンを付けっぱなしで寝てしまうことになった。

今朝からはWin10の復旧に入る。
まず、はずしていたHDDを接続して、Win7を起動しているのだが、HDDチェックが走っている。
起動後にイベントビューアを確認すると、Win10関係のパーティションだったため、再度チェックディスクをしている。

なんかごにょごにょログは出ていたが、エラーなどはないらしい。
では、Win7を終了させて、Win10のHDDから起動をする。
だめになったとき、Win7を休止状態にしていたので、それも少し関係しているかもと思ったのだ。

うん、普通にWindows10が立ち上がった。
何事もなく、何事もなかったかのように振る舞っている。
なんだったんだ・・・・・・・・・。


長々と書いたが、こういうのは記録に残しておかないと、あとで困るのだ。
セットアップはよくやるからいいけど、トラブルの場合は対応方法がいろいろ変わってくるので、やったことをメモしておきたい。

因果関係がはっきりしなかったが、起きた現象は以下。

  • Windows10が起動しなくなった。BCD関係でOSのブート時に止まる(Windows7は休止状態にしていた)。
  • Windows10の復旧ディスクで修復するつもりだったが、実際に起動したのはWindows7の復旧処理で、それで何が行われたのかはよくわからない。結果は「復旧できませんでした」だった。
  • その前まで起動していたWindows7が起動しなくなった。これがWindows7の復旧処理を行ったせいかどうかは不明。
  • Windows7なりWindows10なりの復旧ディスクでコマンドプロンプトからHDDドライブを見たが、どれもディスクを正しく認識していないように見えた。
  • ただ、LinuxのLive CDから見ると、ディスクにエラーは生じていない。

やったことは、以下。

  • Windows10 HDDを外し、Windows7 HDDだけで復旧処理をしようとした。これも「復旧できませんでした」で終わった。
  • bcdbootやbootrecを使うとWindows7の起動処理は動いたが、CI.dllがないと言われる。ファイルとしては存在していたが、復旧ディスクに入っていたCI.dllとはサイズが違った。差し替えると、ブートは進むようになったが、ブルースクリーンになる。その状態で復旧処理をしたが「復旧できませんでした」で終わる。
  • EaseUSでバックアップしていたCドライブの内容でリカバリした。ファイル単位の復旧がしたかったのだが、無料版だからか、ドライブごとのバックアップをしていたためかわからないが、できなかった。リストアの結果、少し古い内容ではあるがWindows7が起動するようになった。
  • その後、Windows10のHDDを接続してWindows7を起動し、エクスプローラ→ツールでディスクチェックをすべてのセクタに対して行った(接続して起動したときにもチェックは走った)。
  • BIOSのHDD選択でWindows10 HDDを選んで起動すると、特に復旧処理も行わずに起動できた。

うーん。
もしWindows7がちゃんと起動できるようであれば、単にWindows10のHDDをチェックしてファイルシステムの情報が正しくなりさえすれば終わった話かもしれない。
休止状態で終わらせたのが、何かまずかったのだろうか・・・。

様子見として、Windows10を起動するときには、めんどうだけどWindows7の休止状態は使わないようにしよう。
SSDとかで起動が速ければ毎回終了させたいのだけど、なかなか起動するのを待てなくてねぇ。

2016/02/04

[esp8266]気になっていることを確認(don’t use rtcとリンクサイズ)

ESP8266で、気になっていることを確認しておく。

確認したバージョンは、Non-OSのV1.5.2だ。


”don’t use rtc mem data”は私が原因なのか?

起動すると「don't use rtc mem data」というメッセージがコンソールに出てくる。
直訳したら「RTCメモリデータは使うな」だけど、何だかよくわからない。
前回は「なんだったんだ」で終わらせたけど、もう少し見ておく。

 

以前書いたHello Worldに、少し出力を追加した。
https://github.com/hirokuma/esp8266_helloworld/commit/fb870850fd9d9468e119e7b928055826525ecff6
user_rf_pre_init()とuser_init()で出して、どこら辺で出ているのかを確認する。

image

通信速度があっていないところは文字化けしているが、こちらで出しているコンソールログは化けてない。
これを見ると、user_rf_pre_init()とuser_init()の間で出していることがわかる。
なので、実装した箇所で出力する可能性があるのはuart_init()だけど、user_rf_pre_init()では出てないので違うと思う。
思うが、確認したい。。。
起動時が74880bpsなんて変な速度でさえなければ。。。

うちのPC環境では74880bpsを受け取れないので、ロジアナで見た。
uart_init()をコメントアウトして実行だ。
ブログエディタのプラグインがまだ使えないので、ログが見づらいが許しておくれ。


ets Jan  8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 1856, room 16
tail 0
chksum 0x63
load 0x3ffe8000, len 776, room 8
tail 0
chksum 0x02
load 0x3ffe8310, len 552, room 8
tail 0
chksum 0x79
csum 0x79

2nd boot version : 1.5
SPI Speed      : 40MHz
SPI Mode       : QIO
SPI Flash Size & Map: 32Mbit(1024KB+1024KB)

jump to run user1 @ 1000
       VsXX OY F   

SDK ver: 1.5.2(80914727) compiled @ Jan 29 2016 17:26:12
phy ver: 484, pp ver: 9.6

user_init

ets Jan  8 2013,rst cause:2, boot mode:(3,7)
load 0x40100000, len 1856, room 16
tail 0
chksum 0x63
load 0x3ffe8000, len 776, room 8
tail 0
chksum 0x02
load 0x3ffe8310, len 552, room 8
tail 0
chksum 0x79
csum 0x79

2nd boot version : 1.5
SPI Speed      : 40MHz
SPI Mode       : QIO
SPI Flash Size & Map: 32Mbit(1024KB+1024KB)

jump to run user1 @ 1000
       VsXX OY F VY1 P  S !     

SDK ver: 1.5.2(80914727) compiled @ Jan 29 2016 17:26:12  
phy ver: 484, pp ver: 9.6

user_init

赤文字は、こちらがログ出力させている文字列。
あれ・・・don’t useも出てないが、user_rf_pre_init()も出てない。

また、最近なのかどうかわからないが、リセットが2回走ってから起動しているのが気になる。
boot modeの出力が2回あるが、最初は(3, 6)、次は(3, 7)。
Causeとboot modeはこういうことらしいので、リセットピンでリセットして、起動デバイスはFLASHということだろう。
http://www.esp8266.com/viewtopic.php?p=2096#p2112
最後の6とか7とかが、わからないままだ。

よくわからないので、user_rf_pre_init()を空実装にすると、boot mode(3, 7)だけだ。
うまく説明できないが、user_rf_pre_init()に実装を置くのは良くない感触だ。
また調べるかもしれないが、今回はここまでにしておこう。

あ、user_rf_pre_init()を空実装にして、user_init()でuart_init()を呼ぶようにしたら”don’t use rtc” が出るようになった。
くっ・・・気になるが、今回はここまでだ。

 

リンクサイズ

Makefileに、-lsslだの-lsmartconfigだの入っているが、使ってないので、バイナリに影響が出てるのかどうかを確認する。
こっちはビルドするだけだ。
中身はあまりチェックせず、sizeコマンドで大きさだけ見てみる。

IoT_Demoと同じ構成でビルド。


size .output/eagle/debug/image/eagle.app.v6.out
   text	   data	    bss	    dec	    hex	filename
 215206	    884	  25184	 241274	  3ae7a	.output/eagle/debug/image/eagle.app.v6.out


以下をコメントアウトしてビルド。

#    -lupgrade\
#    -lssl    \
#    -lpwm    \
#    -lsmartconfig \


size .output/eagle/debug/image/eagle.app.v6.out
   text	   data	    bss	    dec	    hex	filename
 215206	    884	  25184	 241274	  3ae7a	.output/eagle/debug/image/eagle.app.v6.out

同じやね。