(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 処理中に発生する割り
> 込みに対して,割り込みの出口でのディスパッチを禁止するためとの理解でよ
> ろしいでしょうか.

はいそのとうりです.割り込みの一番内側か外側かを判断するためだけに使用し
ています.