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 に関しては以下が参考になった。
- https://developer.mbed.org/users/ytsuboi/notebook/ja-dev-mbed-os-5/
- https://github.com/ARMmbed/mbed-os/blob/master/docs/mbed_targets.md
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()
というマクロが定義されており、そこから現在のスタックポインタが解る。