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

yoshiki.matsumoto @ nts.ricoh.co.jp yoshiki.matsumoto @ nts.ricoh.co.jp
2010年 11月 30日 (火) 09:19:11 JST


高田様

早速のご回答ありがとうございます。
コードに問題がないことは理解しました。

しかし、割込み処理からの一連の流れとしてフローチャートなどに表すと
あまり気持ち良いものではないです。

松元@リコー


Hiroaki TAKADA <hiro @ ertl.jp> wrote on 2010/11/29 22:42:09:

> 松元様

> 1つめの質問にお答えします。

> JSPカーネルでは、割込みハンドラの中でタスクを終了させる機能はあり
> ませんので、割込みハンドラの出口でディスパッチ処理を実行する場合
> に、runtskがNULLになる状況はないはずです。よって、今のコードで問
> 題は起こらないものと思います。

> ただ、良いコードかどうかは別問題と思います。

> 高田広章
> 名古屋大学

> (10/11/29 16:41), yoshiki.matsumoto @ nts.ricoh.co.jp wrote:
> > はじめまして。
> > リコーの松元と申します。
> >
> > 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で言う所のスーパーバイザモードとの理解でよいのでしょうか?
> >
> > 以上
> > よろしくお願いいたします.
> >
> >