(toppers-users 2050) Re: ARM対応の割り込みとディスパッチについて
本田晋也
honda @ ertl.jp
2005年 7月 6日 (水) 11:09:28 JST
名古屋大学の本田です.
対応が遅くなってすみません.
#環境がなかったものですから.
Masafumi YASHIKI wrote:
> dispatcher_2 を処理中は,sp はタスクスタックを指しています.この状態で,
> interrupt_count = 1 とし,割り込みを待つと,割り込みハンドラで使用され
> るスタックが割り込みスタックとならず,タスクスタックが使用されることに
> なります.
そうですね.見落としていました.
>
> 現状の回避策として,dispatcher_2 の処理として,次のように sp を
> STACKTOP に変更する処理を追加しております.
>
> dispatcher_2:
> mov r3,#1
> str r3, [r6] ;; interrupt_count = 1
>
> mov r3, sp ;; <-- 追加 スタック変更
> ldr sp, =STACKTOP ;; <-- 追加
> stmfd sp!, {r3} ;; <-- 追加
>
> msr cpsr_c, r4 ;; 割込み待ち
> nop
> msr cpsr_c, r5 ;; 割込み禁止
>
> mov r3,#0
> str r3, [r6] ;; interrupt_count = 0
>
> ldmfd sp!, {r3} ;; <-- 追加 スタック復帰
> mov sp, r3 ;; <-- 追加
>
> b dispatcher_1
>
> 上記の回避策は,妥当な対応と考えられるでしょうか.
dispatcher_2に来たときのspはディスパッチ前のspになっているので保存する必
要はありません.ですので,
dispatcher_2:
mov r3,#1
str r3, [r6] ;; interrupt_count = 1
ldr sp, =STACKTOP <- 追加
とすればいいはずです.
> interrupt_count の変更は,インクリメント/デクリメントではなく,1/0 の
> 代入になっています.
>
> これは,TOPPERS/JSP では,最も外側の割り込みハンドラの出口処理において
> のみディスパッチが行なわれるように実装されています.このことから,
> dispathcer_2 が処理される時点では,interrupt_count == 0 が保証されてお
> り,interrupt_count = 1 とするのは,dispatcher_2 処理中に発生する割り
> 込みに対して,割り込みの出口でのディスパッチを禁止するためとの理解でよ
> ろしいでしょうか.
はいそのとうりです.割り込みの一番内側か外側かを判断するためだけに使用し
ています.