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

KISHIDA Masami mkishida @ fecsi.furuno.co.jp
2010年 11月 30日 (火) 10:59:29 JST


きしだです

便乗ですいません。
本件、ちょっとソースを見てみたのですが、、

(1) 起動直後から最初のタスクに切り替わる所までは割り込み禁止の状態で
  且つ、runtskとは関連のない条件で、強制的にタスクに切り替わります。
(2) アプリケーションのタスクが動作した後は、高田先生の説明の通り、
  割込みハンドラの中でタスクを終了させる機能はないのでruntskが
  NULLになる状況はないです。
(3) 終了時は割り込みロック状態にし、非タスクコンテキストに切り替えて
  カーネル動作の終了となりますのでディスパッチは行われません。

(1) (2) (3) からruntskに関するディスパッチ処理は問題ないと思われます。



なお、これを確認していてaspにて気になる点がありました。
JSPではありませんが、、、(sp_at91skyeye_gcc-20100519\asp)

1. 初期化処理のコメント(target_config.c)
  すべての割込みを許可 → 全ての割り込み要因をクリア
  コメントだけ読むと不味いタイミングで割り込み許可を行っている様に
  誤解します。

2. すべての割込みをマスクしてからARM依存の終了処理を行うべきでは?
  ARM依存の終了処理では例外ベクタをセーブされた内容に戻しています。
  ベクタ処理は割り込み禁止で実施すべきかと思います。

1. は実害はないですが、2. は少々宜しくない気がします。


On 2010/11/29 22:42, Hiroaki TAKADA wrote:
> 松元様
> 
> 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で言う所のスーパーバイザモードとの理解でよいのでしょうか?
>>
>> 以上
>> よろしくお願いいたします.
>>
>>
> 
> 
> 

-- 
------------------------------------------------------------
株式会社フルノシステムズ 開発部 ソフトウェア開発課
岸田昌巳        TEL(内線直通)  078-304-5496 * 432
                TEL(部署代表)  078-304-5492
                FAX            078-304-5405
------------------------------------------------------------