さて、前回わかったのは、Advertisingのタイムアウト時間になるとSWI2の割込が発生しているようだ、ということだった。
どのようにして確認したかというと、
- BLEスニファを立ち上げる
- nRF51のアプリを立ち上げる
- スニファでAdvertisingが止まるのを待つ
- デバッガで止める
だ。
うちはGNU環境なので、EclipseでGDBを使っているのだが、まあ他でも同じだろう。
もしかすると、有償の環境はもっとすごいのかもしれない。
有償の開発環境でうらやましいのは、ビルド以上にデバッグですな。
SoftDeviceを使った環境では、割り込みベクタはSoftDeviceが握っている。
Cortex-M0ではベクタオフセットレジスタがオプション扱いで、nRF51822ではレジスタがないから、変更できない。
動的にベクタが変わらないのは、デバッグとしてはやりやすい。迷わなくて済むし。
それ故、アプリが割り込みベクタと思って定義しているものは、単にSoftDeviceが関数呼び出しをするのに使っているベーブルだろうと思う。
SoftDeviceの中身を知らないし、デバッガで追ったわけでもないが、一度SoftDeviceが割り込みベクタから呼び出されたのにアプリの方まで呼んでいるというのは、そういうしくみになっているとしか思えない。
gcc_startup_nrf51.sを見ると、ベクタテーブルが定義されている。
この場所は、SoftDeviceが固定で呼び出すアドレスになるので、順番などは変更できない。
これを今はTOPPERS/SSPが使うようにしていて、自分のデフォルト割り込みハンドラに飛ばしている。
だから、OS無しのときはAdvertisingのタイムアウトによって呼ばれていたハンドラが呼ばれないのだ。
では、どうすべきか。
ITRONにならって、TOPPERS標準割り込み処理モデルを定義してから既存のSWI割込を呼び出すようにすべきか。
あるいは、既存の流れにそのまま載せるために、標準割り込み処理モデルをそこだけ使わないようにするか。
うーむ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。