blog画像が表示されないページは、元画像を間違えて削除してしまっているためです。データが残っていないので、想像力で補ってください。16KBでは無理EIDをSlotに割り当てようとするとAndroidアプリのログにエラーが返ってくる件だが、どうもnRF51822側が最初の要因になっているようだ。RTTでログを取っていると、EIDのconfigure後にSESが固まってしまった。JLinkを抜くと動き出したので、何か邪魔しているようだ。RTTを全部消して動かすと、HardFaultが発生していた。SESにはMMDというトレースするようなデバッグができるようなのだが、nRF51ではサポートしていないらしい。コールスタックを見ると、0x20001350が直前なので、これはRAMアドレスだ。Scriptを見ると、RAMの開始は0x20002080にして最初の方はSoftDeviceが使うように空けている。v2.0.0のリリースノートを読むと、最低でも4.9KB(0x13C8)は使うようになっている。Filesに入っていた。それには、RAMが0x20000000からになっている。これは__vectors_ram_load_start__が0x20002080になっているから、いいのかな?となると、コールセンターに出ているアドレスはSoftDeviceが管理している領域でよいだろう。いえ、いくらSoftDeviceでもRAMにコードを書いて実行するとは考えづらい。いうことは・・・スタック不正でHardFaultしたのか?もしかして、RAMが足りてない??EIDでごにょごにょするということは、楕円曲線暗号の処理を行うのだろう。それがどのくらいRAMを必要としているかは、把握していない。スタックは4KBでやってるのだけど、さて、どうしたらよかろうか。S130ではsd_ble_enable()でSoftDeviceが使用するRAMサイズを処理するようになったが、APIはsoftdevice_enable()の中で呼ぶようになったようだ。呼んだ後の、戻り値であるble_enable_paramsを見てみよう。Tableのサイズだろう。これを、SoftDeviceが使う4.9KBに加えたサイズが、実際に使用するサイズになるはず。0x26B89KBくらいがアプリとして使えるRAMサイズだろう。静的な変数の領域が足りなければリンカがエラーを出してくれるだろうし、ヒープは使わないので、スタックサイズをもっと増やせばよいはずだ。いや・・・そうなのだろうか。スタックの領域は、RAM領域の後ろからずんずん増えるだけだと思う。静的変数の領域が足りない、というリンカのエラーは「スタックがこれだけ使うはずだから、それと重なりますよ」というエラーになるはず。動的にスタックサイズが足りないからといって、HardFaultは発生しないんじゃないだろうか。それで発生するんだったら、コールスタックでももう少しそれっぽいアドレスになっているはず。いうことは、単純にRAMが足りなくて、スタックが静的変数の領域を侵してしまったと考えるのが妥当か。HardFaultが発生したときのStackPointerは0x20002AF0だった。MAPファイルを見ると、BSS領域の終わりは0x20003118だ。IDを16KBのRAMで試すのは無理そうだ。タイマが多いせいか、それがけっこうRAMを消費しているようだ。タイマを減らしても足りないだろう。暗号化周りもけっこうRAMを使っている感じがする。RAMの後ろの方に暗号化関係のメモリが配置されているようで、普通に使う分には大丈夫のようだ。スタックも、そこまで使ってないのだろう。件のコメント:コメントを投稿コメントありがとうございます。申し訳ないですが勝手に削除することもあります。コメントを投稿できるのは、このブログのメンバーだけです。