(toppers-users 3303) ARM対応の割り込みによる遅延ディスパッチについて
yoshiki.matsumoto @ nts.ricoh.co.jp
yoshiki.matsumoto @ nts.ricoh.co.jp
2010年 11月 29日 (月) 16:41:42 JST
はじめまして。
リコーの松元と申します。
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で言う所のスーパーバイザモードとの理解でよいのでしょうか?
以上
よろしくお願いいたします.