2015/06/21

ARMのSVC

ARMのSVCは、旧名SWIらしい。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ij/Cihidabi.html

Thumbの場合は8bitで、ハンドラとしては引数に番号が載っているだけのようだ。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203gj/Cihdhefa.html

で、その番号でswitch-caseして処理を呼ぶ、と。
それなら、nRF51の番号とOSの番号が重ならなければよいはず。

ただ、ARMのベクタテーブルは0x0000から始まっていて、そこはSoftDeviceが握っている。
SVCのベクタテーブルは11番目なので、アドレスとしては0x2C。
SoftDeviceのHEXファイルを見ると、51070000。リトルエンディアンでThumbなので、0x0x0000_0750。
うーん、まだSoftDeviceの中だ。

STM32にはベクタテーブルのアドレスを移動させるような機能があったけど、あれはSTMだけなのかなぁ。
いや、そういうレジスタがあるらしい。
http://www.aps-web.jp/academy/cortex-m/18/
が! Cortex-M0にはなさそうだ・・・。
image

M0+だと、System Control Blockの中にVector Table Offset Registerという項目があるのだ。
ってことは、M0にはないんだろう。

リセットしたときの動作しか見ていないが、一度SoftDevice側のハンドラが動いて、そこから自分でビルドしたリセットハンドラが呼び出されているようだ。
ということは、SVCも同じで、nRF51 SDKに従って素直にSVC_Handlerを作っておけば、SoftDeviceが自分でやりたいことをやった後でこちらのハンドラを呼んでくれるんじゃないかな。
であれば、OS側のソースが全部こっちにあるなら、処理番号だけ重ならないようにしておくだけで済みそうだ。

SoftDeviceの処理番号は、nfc_soc.hにある。
SOC_SVC_BASE(0x20)~SVC_SOC_LASTが使われるようだから、そこだけ避ければよいかな?
・・・いや、ble_ranges.hを見ると、0x60以降も使っているようだ。
じゃあ0x20以前ならよいかというと、nrf_mbr.hだと0x18を使っているみたい。
nrf_sdm.hだと0x10がベースになってるし。。。
うーーん、どこが空いてるんだ???

 

SSPのARM-v6M依存部分を見ていたが、SVCが使われていないように見える。
exc_entryが呼ばれるようなのだけど、exc_tbl[]に従って飛ぶだけのような感じがする。
そして、exc_tbl[]の11番はデフォルトのハンドラっぽい。
そもそも、このテーブルは15番と19番以外が使われていないので、未使用なんじゃないかなあ。

まあ、動いても動かなくても、締め切りがあるわけでもないからいいか。

0 件のコメント:

コメントを投稿

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

注: コメントを投稿できるのは、このブログのメンバーだけです。