昨日、nRF51822のADC完了のタイミングでNotifyを出そうとして失敗した。
その原因は、Cortex-M0の割込み優先度に対する動作の仕様で、高い優先度のハンドラを実行しているときに低い優先度の割り込みを発生させようとするとHardFaultが起きる、というものだ。
ADC完了の優先度を下げると、今度はBLE_ERROR_GATTS_SYS_ATTR_MISSINGが起きた。
これは、過去にも起きている。
- hiro99ma blog: [nrf51]BLE_ERROR_GATTS_SYS_ATTR_MISSINGが起きる
- hiro99ma blog: [nrf51]Notifyを受けられるようにするとSYS_ATTR_MISSINGが起きない
- hiro99ma blog: [nrf51]BLEスタックのイベントハンドラを見る (6)
って、これってもう昨年の話になるのか・・・。
それから私が何をしていたかというと、SoftDeviceのバージョンアップに翻弄されたり、CCCD調べたり、FeliCa Linkつなげたり、BlueZ調べたり、それなりに何かしていたようだ。
が、この問題は放置していたようだ。
結局、これは何が原因なのだ?
まず、このエラーを返すときのシーケンスを。
GATTS Handle Value Indication or Notification with System Attributes Missing
この「System Attributes Uninitialized」が原因だろう。
だから、sd_ble_gatts_sys_attr_set()しているのだ。
では、System Attributeってなんだろう。
GATTS System Attributes Handling: Unknown Peer
GATTS System Attributes Handling: Bonded Peer
このシーケンスでも、アプリにBLE_GATTS_EVT_SYS_ATTR_MISSINGが来ている。
ただ、このシーケンスは相手(peer)からATT読み出し要求が来たときだ。
setする関数の説明を見ても、persistent attributeは接続時にリセットされるとあるので、そのタイミングで設定してやればいいってことだろうか。
そして、以前に接続したことがあってpersistent storageに情報を保持しているのなら、それを設定する。持ってなければNULLを設定する、くらいな感じでよさそうな気がする。
sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
うん、よさそうだ。
というわけで、現在までのところをコミットした。
https://github.com/hirokuma/nrf51822_adctest
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。