多重割り込み対応

とりあえずwinarmのソースを読むと仕組みはなんとなくわかった。
まず開始時

  1. 割り込みベクタより割り込みの前処理にジャンプ
  2. lrを待避後r0も待避
  3. CPSR(状態レジスタ)をR14にロードしてスタックへ待避
  4. VICにセットされた処理の先頭アドレスをr0にロード
  5. スーパーバイザーモード移行(ここで再度割り込み許可状態になる)
  6. 後は普通にレジスタの待避後r0にセットされてる割り込み処理の先頭に移動。

終了時

  1. 待避したレジスタを復帰
  2. モードをIRQに移行(ここで再度割り込み禁止状態)
  3. 待避したr0を復帰
  4. 待避したcpsrの値をspsrに移動(ユーザー処理復帰時に自動的にspsrの内容はcpsrにロードされるため)
  5. PCに割り込み前のアドレスをロード

という感じになっている。たしかにこれだと多重割り込みが可能になりそう。
処理は少しロスがあるけど、多重割り込み前提なら仕方ないかも。