A Day in the Life

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() というマクロが定義されており、そこから現在のスタックポインタが解る。

記事の一覧 >

関連するかもエントリー

mbed で Callback 関数を扱う
mbed のコアAPI、 Ticker などでも使われている、FunctionPointer を使う。https://developer.mbed.org/users/mbed_official/code/mbed-src/file/a11c0372f0ba/api/Functi...
mbed のコアAPI、 Ticker などでも使われている、FunctionPointer を使う。https://developer.m...
nrf51 の nano.specs で printf で float の値を表示する
float の値を printf に表示したいだけなのに時間がかかった…。newlib-nano を使ってるので、https://devzone.nordicsemi.com/question/5076/using-floats-with-sprintf-gcc-arm-none...
float の値を printf に表示したいだけなのに時間がかかった…。newlib-nano を使ってるので、https://devzo...
mbed で MAX7219 + 8桁7セグメントLEDを使う
ebayで約200円で売られている、MAX7219 + 8桁7セグメントLEDを mbed で動かした。SPIで制御するのだけど、MISO は必要なく、繋ぐ線は(mbed) MOSI -> (MAX7219) DIN(mbed) SCK -> (MAX7219) CLK(mbed...
ebayで約200円で売られている、MAX7219 + 8桁7セグメントLEDを mbed で動かした。SPIで制御するのだけど、MISO ...