(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>