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

Shinya Honda honda @ ertl.jp
2010年 11月 30日 (火) 13:38:12 JST


きしださん

本田です.

ご指摘ありがとうございます.コメントいただいた点について修正しました.次
回のリリースに反映されます.

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

(2010/11/30 10:59), KISHIDA Masami wrote:
> なお、これを確認していて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で言う所のスーパーバイザモードとの理解でよいのでしょうか?
>>>
>>> 以上
>>> よろしくお願いいたします.
>>>
>>>
>>
>>
>>
> 


-- 
本田 晋也(Shinya Honda)
名古屋大学 大学院情報科学研究科 附属組込みシステム研究センター 准教授
E-mail  honda @ ertl.jp
WWW     http://www.ertl.jp/~honda/
TEL/FAX 052-789-5888/5889