(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