(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