2015/06/14

[nrf51]pstorageがいくつもある

nRF51 SDKは、いろいろとAPIやライブラリがある。
把握しようとしても、数ヶ月ごとに新しくなり、しかも内容が変わっているので、把握する気になれない。
とりあえずBLEに直接関係あるところだけ、とも思っていたのだが、それですらざくざくと変更が入っていく。
正気を保てているのは、仕事でやっていないから、というだけじゃなかろうかとすら思ってしまう。

最近、アドバタイジングするチャネルを選択できるという餌に吊られてSoftDevice v8.1.0系に対応しようとしている。
とりあえずの移植だけは出来たのだが、気になることがある。
アドバタイジングするとき、pstorageのAPIを呼ぶようになってしまったのだ。

 

pstorageは「Persistent Storage Manager」の略のようで、日本語に直訳すると「永続的なストレージ管理」だろう。
字面から受けとるイメージとしては、Non-Volatileなメモリ、例えばE2PとかFLASHとかに、ファイルシステムとまではいかないにしても、なんらかの管理用メモリを持つということじゃなかろうか。
複数のデバイスからCONNECTされる前提だったり、そうでなくても前と同じデバイスから接続されたら続きから始めたいということもあるだろうから、Peripheral側でも何らかの管理情報を持ちたいことはあるだろう。

そういう事情があったとしても、接続相手の情報がどうのこうのというのはアプリで管理するものであって、BLEの下回りが自動的にやるようなものじゃないんじゃなかろうか・・・。
あるいは、無線の法律的な関係で、最後に無線を送信してからある程度の休止期間が必要、ということを考慮したものであろうか・・・(BLEじゃないお仕事では、そういう考慮もしてた)。


まあ、細かい考察は置くとして、今回はpstorageだけについて考えたい。
何を考えるかというと、「どのpstorageを使えばよいのか?」だ。

何を言っているのかわからないと思うので、ファイル構成を載せよう。

image

私はnRF51822をGCC+Makefileで使っているのだが、他のIDEを使っていたとしても同じだろう。
nRF51822でアプリを作る場合、構成としては、

自分のアプリ+nRF51 SDK+SoftDevice

とする場合がほとんどだと思う。
SoftDeviceは事前にnRF51822に焼き込むからよいとして、nRF51 SDKはソースファイルで提供されている。
だから、その機能を使いたい場合、自分でビルドしなくてはならない。

そして、nRF51 SDK v8.1.0のcomponents/ble/ble_advertising/ble_advertising.cにあるble_advertising_start()ではこうなっている。

image

このファイル内で"pstorage"がついているのはこれだけなので、このためだけにpstorageをリンクせねばならない。
どこに定義があるのだろうとgrepした結果が、これ。

image

pstorage.cと、pstorage.nosd.cにあるのだ。
さて、どっちをリンクするように設定したらよいのだろうか?


検索して、唯一出てきたのが、これ。
https://developer.nordicsemi.com/nRF51_SDK/nRF51_SDK_v7.x.x/doc/7.0.1/s110/html/a00086.html

表の3行目に出てくる。

無線系のチップなので、アプリ側で処理を占有してしまったりすると、きっと通信エラーなどが発生するだろう。
優先度は無線側に強く割り当ててあるとは思うが、OSを使っているわけでも無いのでやろうと思えば何でも出来るはず。

そもそも、「nosd」は、「NO SD」という意味なのだろうか?
NO Storage Device ?
NO SD card ??
解釈はいろいろと出来てしまう。

でも、nosdの方にも、flashなんちゃらというAPIが使われているので、なんだかもう、探るのが嫌になってしまった。
pstorageを使うつもりがなければ、適当にpstorage_access_status_get()を実装してしまって、無条件でSUCCESSを返してしまえばよいのではなかろうか、と思った。

こういう不透明なところが、扱うのが難しいところですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。