(toppers-users 3303) ARM対応の割り込みによる遅延ディスパッチについて

yoshiki.matsumoto @ nts.ricoh.co.jp yoshiki.matsumoto @ nts.ricoh.co.jp
2010年 11月 29日 (月) 16:41:42 JST


はじめまして。
リコーの松元と申します。

TOPPERS/JSP 1.4/1.4.1の ARM対応の割り込みによる遅延ディスパッチに
ついて質問があります。

ディスパッチ処理(dispatcher_1)では、最優先タスクが設定されていない場合
割込み処理による実行タスクを待ちます(dispatcher_2)。

dispatcher_1:
        /*
         *  ここではシステムモード・割込み禁止状態でなければならない.
         */
        ldr   r0, =schedtsk   /* schedtsk を読み込む */
        ldr   r1, [r0]
        ldr   r2, =runtsk     /* schedtsk を runtskに */
        str   r1, [r2]        /* schedtsk がいない場合はruntskをNULLに */
        cmp   r1, #0
        beq   dispatcher_2
dispatcher_3:
        ldr   sp, [r1,#TCB_sp] /* タスクスタックを復帰 */
        ldr   pc, [r1,#TCB_pc] /* 実行再開番地を復帰   */
dispatcher_2:
        mov   r3,#1
        str   r3, [r6]
        /* sleepモードを持つCPUなら書き換える */
        mrs   r0, cpsr                     /* FIQを継承            */
        and   r0, r0, #CPSR_FIQ_BIT
        orr   r0, r0, r4
        msr   cpsr, r0        /* 割込み待ち      */
        WAIT_INTERRUPT
        mrs   r0, cpsr                     /* FIQを継承            */
        and   r0, r0, #CPSR_FIQ_BIT
        orr   r0, r0, r5
        msr   cpsr, r0        /* 割込み禁止      */
        mov   r3,#0
        str   r3, [r6]
        b     dispatcher_1

タスクからのディスパッチ処理(dispatch)ではレジスタ R4-R6にそれぞれ以下の
値が設定されていますが、割込みからのディスパッチ処理では R4-R6は設定
されていません。
        ldr   r6, =interrupt_count  /* r6 <-interrupt_count */
        mov   r5, #(CPSR_SVC|CPSR_IRQ_BIT)  /* 割り込み禁止(システムモード)
*/
        mov   r4, #(CPSR_SVC)               /* 割り込み許可(システムモード)
*/
もし、割込みからディスパッチ処理が呼ばれて最優先タスクが設定されていない
場合は、動作が不定になると思われます。

最初の質問は
割込みからディスパッチ処理を実行する場合(reqflg≠0)は必ず最優先タスクが
設定されており dispatcher_2は絶対に実行されないと考えてよいのでしょうか?

もう一点質問があります。
ディスパッチ処理のソースに記述されたコメントについて、システムモードとは
ARMで言う所のスーパーバイザモードとの理解でよいのでしょうか?

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