(toppers-users 2390) V850SA1での使用について

M.Kogan nemuri @ mui.biglobe.ne.jp
2006年 4月 4日 (火) 10:57:23 JST


古賀(古賀製作所)です。
うちの担当者がMLに投げようとしたのですが、登録と投稿がうまく行かない
ようなのでとりあえず代理でご報告します。
# 以前は登録できてたらしいんですが、2月末にメールサーバ(kogasw.com)が
# トラブったときに登録が消えて、それ以降登録できないらしいのです。
# 登録できたら本人に参加してもらいますのでよろしくお願いします。

# ちなみに環境は gcc=2.95.3, binutil=2.16, newlib=なし です。


−−ここから元メール

初めまして、
古賀製作所の古川と申します。

V850/SA1にjsp1.4.2を使っています。
気づいたことがあるのでお知らせします。

動けるタスクがない状態で

/////////////cpu_support.Sより
di
nop
nop
nop
nop
nop
ei
/////////////
とすることで割込みを待っている部分がありますが、
V850/SA1においては、このNOPが7個必要なようです。

カーネル起動時にタスクを起動し、
割込みが発生するまで、スリープ
という動作をさせていたら
いくらキー入力しても何の反応もなかったので
CPUのマニュアルを読んでみたら、
eiからdiまでの間に7クロック無いと割込みを認知しない、とのことでした。

jsp1.4.2パッケージに入っているV850ES用そのままでは動かないみたいです。
おなじシリーズとはいえ、結構違うんでしょうか?

あともうひとつ、
レジスタep(r30)についてですが、

cpu_support.Sのなかの_kernel_dispatchにて
コンテキストの退避部分で、まずepをスタックに積んでいます。
これはわかるのですが、

vector_handler、および
getting_ready_for_contextswitch
ではepがスタックに退避されていません。

getting_ready_for_contextswitchでは以下のように
///////////////////////////
st.w ep, -4[sp] /*epを使いたいので真っ先に退避 */
addi -68, sp, ep
sst.w r20, 64[ep]
///////////////////////////
epをスタックに積んでいますが、すぐに上書きされています。

近頃、タスクを複数個動かした場合によく暴走していましたので、
このあたりを調べてみましたら
プリエンプトされたタスクが復帰する際に
プリエンプトされた時とepの値が違うことを確認しました

ですので
getting_ready_for_contextswitchに来た時点でepをスタックに積み、
recover_from_contextswitchでepをスタックから取り出す、
ということをしたところ、今のところ暴走することなく、無事動作しています。

ただ、これで正しいのかどうなのかよくわかっていないため、不安が残ります。
こういったepの扱いは正しいのでしょうか?

−−元メール終り



---------------------------
有限会社古賀製作所 古賀正男