BLE Nano V1.5 を mbed 上で 32K RAM で扱う

BLE Nano は V1.0 では 16KB の RAM が、V1.5 から 32K RAM がのっている。が、mbed 上では現在 1.0 ベースしかなく、折角の 32K RAM が使えない。ので使えるようにする方法メモ。

mbed OS 5 の場合

rtos の INITIAL_SP でスタックポインタのアドレスをマッピングしている模様。

#elif defined(TARGET_MCU_NORDIC_32K)
  #define INITIAL_SP            (0x20008000UL)
#elif defined(TARGET_MCU_NORDIC_16K)
  #define INITIAL_SP            (0x20004000UL)

コンパイル時のマクロの追加は mbed-os/hal/targets.json を見て追加されるので、

みたいに変更すればOK。この環境で BLEサンプルのHeartRate が問題なく nano 32K RAM 環境で動いた。

最初 RBLAB_BLENANO_32K な環境を作ってちゃんと pull req 出そうと思ったけど、V1.0 を考慮しつつも V1.5 の環境を追加する場合、スマートな書き方がうまく出来ず、思った以上に追加 & 書き換え項目多くて、報告するだけしておいた…。まだ mbed OS5 は出たて感があるから、ボード追加より開発の方が盛んっぽいしね。

なお targets.json に関しては以下が参考になった。

mbed OS 2 (Classic) の場合

オンラインコンパイラでは現状無理で、手元に落としてリンカの RAM 領域を書き換える。

GCC_ARM 環境を使う場合、手元にエクスポートしたデータ(もしくは mbed-cli から import で classic 用のプロジェクトを持ってくる)のリンカ

mbed/#{hash}/TARGET_RBLAB_BLENANO/TOOLCHAIN_GCC_ARM/NRF51822.ld

MEMORY
{
  FLASH (rx) : ORIGIN = 0x0001C000, LENGTH = 0x24000
  RAM (rwx) :  ORIGIN = 0x20002800, LENGTH = 0x1800
}

から

MEMORY
{
  FLASH (rx) : ORIGIN = 0x0001B000, LENGTH = 0x25000
  RAM (rwx) :  ORIGIN = 0x20002ef8, LENGTH = 0x5108
}

へと書き換える。0x20002ef8 + 0x5108 = 0x20008000 が開始時のスタックポインタとなる。

以前の 16KB 用のリンカだと、プログラム開始(+ちょっと初期化後) のスタックポインタは 0x20003fa8 だったが、32KBに書き換え後のリンカでは、0x20007fa8 となり、0x20008000 から始まっていることが解る。

mbed でスタックポインタを調べる

NRF51なら、GET_SP() というマクロが定義されており、そこから現在のスタックポインタが解る。