ぽぽろん研究所のサムシング

twitter:@poporon_labもよろしく

nRF52のRAM配置という罠

こんにちは、ぽぽろん研究所です。

nRF5系のブートローダに苦しみられる底辺階級の土方です。
ブートローダがアプリをないことを検出してDFUモードに入る→理解できる。
ブートローダがアプリを検出する→アプリを立ち上げる→リセットする→ブートローダが立ち上がる→アプリを検出→(以下無限ループ)ファ!?

何故か意図しない動作になっているのです。ドキュメント通りにサンプルのブートローダをビルドして、フラッシュを分け、完璧なはずなのに。。。

調べてみるとDFU起動チェック後、アプリを起動するためにアプリのReset_Handlerを呼び出しているのを見つけました。これでアプリが立ち上がることを完全に理解しました(ダニングクルーガー効果)。しかし原因ではないようです。呼び出しているということはアプリ側になにか問題があるのか??

THREE HOURS LATER...

さらにソースを解析して、リセットの入る場所を調べると、割り込み関係が怪しいことがわかりました。ブートローダでアプリを立ち上げる前にIRQの設定を変更している箇所があるので、この辺が怪しいのかと思い調べました。

しばらく調べると、IRQのベクターテーブルが蒸発していることが原因だとわかりました。ブートローダがアプリを立ち上げる前にアプリのベクターテーブルを0x20000000に配置されます。その後アプリを立ち上げるのですが、アプリ側のRAMのレイアウトが0x20000000から使用するようになっていると配置したベクターテーブルが蒸発してIRQの呼び出し先がわからなくなり、CPUロックアップによるリセットがかかっていたようです。RAMの配置を0x20000008からにすれば良いみたいです。

SDなしでMBRからアプリを立ち上げようとしたおろかな私の物語でした。

それでは、また次回。

参考: https://devzone.nordicsemi.com/guides/short-range-guides/b/getting-started/posts/adjustment-of-ram-and-flash-memory