(toppers-users 3304) Re: ARM対応の割り込みによる遅延ディスパッチについて
Hiroaki TAKADA
hiro @ ertl.jp
2010年 11月 29日 (月) 22:42:09 JST
松元様
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で言う所のスーパーバイザモードとの理解でよいのでしょうか?
>
> 以上
> よろしくお願いいたします.
>
>