(toppers-users 3880) SSP cq_starm_gcc版 プリエンプトされた後の割り込みハンドラからの戻りについて

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2012年 2月 4日 (土) 13:09:29 JST


 こいさんです

 Cortex-M3に実装の話です。
sample1を動作させているとき、main_taskはタイマ割り込みから呼ばれた周期ハンドラからiact_tskで起動がかかり、タイマの割り込みハンドからThreadモードに移行してmain_taskが実行されます。
main_taskを終了すると、割り込みハンドまで戻り、SVC命令でThreadモードに戻して、割り込み前の処理に戻っています。
この時の割り込み元に戻る処理に疑問があります(prc_support.S)。

1) プリエンプションが発生した場合(周期ハンドラで、iact_tskがあった)

kernel_svc_handler:
 /*
  *  割込み処理からのリターンにより,CPUロック解除状態に移行するよ
  *  う準備する.
  */
 cpsid f         /* 割込みロック状態へ */
 ldr  r2 , [ sp , #(EXC_FRAME_SIZE) ] /* lrをスタックから取得 */
 add  sp, #EXC_FRAME_SIZE + 8   /* スタックを捨てる */
 mov  r0, #0
 ldr  r1, =lock_flag     /* CPUロック解除状態へ */
 str  r0, [r1]
 msr  basepri , r0 // ** lock_flagの値を書き込んでいる **
 bx  r2        /* リターン   */

2) 通常のタイマ割り込で元に戻る場合は(iact_tskがなかった)
ret_int_1:
/*
* ここには割込みロック状態(FAULTMASKがセット)された状態で来る.
* Threadモードからのリターンにより自動的に割込みロック解除状態になる.
* 割込み優先度マスクは割込み前に状態に戻す.
*/
pop { r2 }
pop { r1 }
msr basepri, r1 /* 割込み優先度マスクを割込み前に状態へ */
bx r2 /* リターン */

どちらも同じ形で戻る必要がある思いますが、basepriに設定される値は、プリエンプトされた場合、割り込み前の値ではなく、lock_flagの値が使われています。

単なる誤りのように思いますが、何か意図があるのでしょうか。
(タスク間でロックレベルを引き継ぐとは思えませんし、多重割り込み時も引き継ぐ必要は無いと思っています)

以上
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20120204/50d41a33/attachment.html>