多重割り込み対応
とりあえずwinarmのソースを読むと仕組みはなんとなくわかった。
まず開始時
- 割り込みベクタより割り込みの前処理にジャンプ
- lrを待避後r0も待避
- CPSR(状態レジスタ)をR14にロードしてスタックへ待避
- VICにセットされた処理の先頭アドレスをr0にロード
- スーパーバイザーモード移行(ここで再度割り込み許可状態になる)
- 後は普通にレジスタの待避後r0にセットされてる割り込み処理の先頭に移動。
終了時
- 待避したレジスタを復帰
- モードをIRQに移行(ここで再度割り込み禁止状態)
- 待避したr0を復帰
- 待避したcpsrの値をspsrに移動(ユーザー処理復帰時に自動的にspsrの内容はcpsrにロードされるため)
- PCに割り込み前のアドレスをロード
という感じになっている。たしかにこれだと多重割り込みが可能になりそう。
処理は少しロスがあるけど、多重割り込み前提なら仕方ないかも。