(toppers-users 1843) ARM対応の割り込みとディスパッチについて

Masafumi YASHIKI yashiki.masafumi @ sharp.co.jp
2005年 1月 7日 (金) 11:33:26 JST


はじめまして.
シャープの屋鋪と申します.

TOPPERS/JSP 1.4/1.4.1 の ARM 対応について質問があります.

現在,TOPPERS/JSP の ARM パッチをベースに弊社の ARM MPU への移植を行なっ
ております.

TOPPERS/JSP の ARM パッチでは,実行できる状態のタスクがない場合の処理
として,割り込み待ちのループ処理が実装されています.cpu_support.S の 
dispatcher_2 に相当する部分です.当該箇所では,interrupt_count = 1 と
し,割り込みを待つように記述されています.次のようなシナリオの場合,ス
タックポインタが意図した通りに設定されていないように思われます.

シナリオ
1. 実行できる状態のタスクがない
2. dispatcher_1 と dispatcher_2 をループし,割り込み待ち
3. 割り込み発生

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

上記の回避策は,妥当な対応と考えられるでしょうか.

これに関して,さらに質問があります.

interrupt_count の変更は,インクリメント/デクリメントではなく,1/0 の
代入になっています.

これは,TOPPERS/JSP では,最も外側の割り込みハンドラの出口処理において
のみディスパッチが行なわれるように実装されています.このことから,
dispathcer_2 が処理される時点では,interrupt_count == 0 が保証されてお
り,interrupt_count = 1 とするのは,dispatcher_2 処理中に発生する割り
込みに対して,割り込みの出口でのディスパッチを禁止するためとの理解でよ
ろしいでしょうか.

以上,よろしくお願いいたします.

............................................................
屋鋪 正史	Masafumi YASHIKI
シャープ株式会社       IC事業本部 
                       要素技術開発センター 第4開発室

............................................................
屋鋪 正史	Masafumi YASHIKI
シャープ株式会社       IC事業本部 
                       要素技術開発センター 第4開発室