(toppers-users 2275) ARM対応の割り込みとスタックの復帰について

Masafumi YASHIKI yashiki.masafumi @ sharp.co.jp
2006年 1月 31日 (火) 19:25:40 JST


シャープの屋鋪と申します.

TOPPERS/JSP 1.4/1.4.1/1.4.2 の ARM 対応について質問がございます.

割り込みからの復帰する際の割り込み許可のタイミングとスタックの復帰の手
順に関してです.

cpu_support.S では,
ret_int_2:              
        ldmfd sp!, {r0}       /* spsr を復帰 */
        mrs   r2, cpsr        /* FIQを継承            */
        and   r2, r2, #CPSR_FIQ_BIT
        and   r0, r0, #~CPSR_FIQ_BIT
        orr   r0, r0, r2                    
(A)     msr   cpsr, r0      
(B)     ldmfd sp!, {r0 - r3,ip,lr,pc} /* タスクへ戻る */

で割り込みから復帰しています.

一方,sys_support.S では,
return_to_task_irq:
        ldmfd   sp!,{r1}           /* CPSRの復帰処理 */
        mrs     r2, cpsr           /* FIQを継承            */
        and     r2, r2, #CPSR_FIQ_BIT
        and     r1, r1, #~CPSR_FIQ_BIT
        orr     r1, r1, r2                 
(C)     msr     spsr, r1           /* 割り込み許可   */
(D)     ldmfd   sp!,{r0-r3,ip,lr,pc}^ /*タスク復帰 + 割込み許可 */

cpu_support.S では,(A)の命令を実行した時点で,割り込み許可状態になり
ます.このため,スタックを復帰する前に割り込みが発生する可能性がありま
す.sys_support.S では,(D)の命令を実行するでは,割り込み許可状態にな
りません.このため,次の割り込みが発生するのはスタックを復帰した後にな
ります.

次のようなシナリオの場合,見積もり以上にタスクスタックを消費し,スタッ
クを溢れさせると思われます.

1. Task_A 実行
2. 割り込み発生.割り込みハンドラ内で,Task_B へのディスパッチ要求
   発生.
3. Task_B 実行
4. 割り込み発生.割り込みハンドラ内で,Task_A へのディスパッチ要求
   発生.
5. ret_int_2 の (A)命令実行直後に割り込み発生.
6. 割り込みハンドラ内で,Task_B へのディスパッチ要求発生.
   このとき,割り込みからの復帰時に Task_A のスタックに余分にレジスタ
   が保存される.

この状況が繰り返し発生すると,Task_A のスタックが溢れる.

cpu_support.S でも sys_support.S と同様にスタックから復帰と,CPSR の復
帰(割り込み許可)が一命令(アトミックに)で行なう必要があるのではない
でしょうか.

よろしくお願いいたします.

--
[This information is confidential.]
...........................................................................
Masafumi YASHIKI
SHARP Corporation
 Development Dept. 1st.
 Advanced Technology Development Laboratories
 Electronic Components and Devices Development Group