Forums: Developers (Thread #14877)

HOS-v4: MIPSへの移植 (2007-05-07 00:26 by rosk_t #29481)

だいぶお久しぶりです。rosk_tです。

最近、シマフジ電機さんのSEMB1200Aというパワフルなロボット用MIPSボードを手に入れたので、HOSを移植して次期ロボットに使おうと思っています。

で、いろいろ手探りしながらpacctx.Sを書き換えて、タスクコンテキストのルートでのタスクの切り替えはできる(タスクからタスクを起こしたりするプログラムは動く)ようになりました。

が、割り込みのルートから遅延ディスパッチが起こるタスクの切り替えがまだ上手くいっていません。とりあえずタスク切り替えは起こる(kernel_end_int)のですが、その際割り込み許可やマスクの情報が上手く保存されていないらしく、二度と割り込みがかからなくなってしまいます。

わからないのは、割り込みがかかった場合、CPUのどのような情報を保存して、どのタイミングで復帰すればいいかということです。このへんはCPU依存なのでしょうが、実はMIPSもあまり詳しくなく(^^;、ほかのCPUのソースも見ながらGWにそれなりにがんばってみたのですがよくわかりません。漠然とした質問で申し訳ないのですが、一般的な話でいいので、アドバイスいただけないでしょうか。もうちょっとでちゃんと動くような気がするのですが。。。

どうぞよろしくおねがいします。

RE: HOS-v4: MIPSへの移植 (2007-05-07 22:57 by ryuz #29496)

お世話になります。Ryuzです。
# 朝出掛けに書こうとしたら送信前にPCがフリーズしちゃいました。 (^^;

割り込み時の遅延ディスパッチは一番分かりにくいところです。

ヒントというか、基本概念ですが、ディスパッチ実行時は、プロセッサのレジスタ状態をタスクコンテキストと同じ状態に変更しておく必要があります。
割り込みハンドらの中でありながらタスクコンテキストにするというと奇妙な感じかと思いますが、次回のタスクスイッチで戻ってきた際に、そのままタスクとしてリターンして継続できる状態にしておく必要があります。

プロセッサがもし割り込みで特殊なモードに切り替わるのなら、無理やりでも(たとえば戻り先を書き換えてから割り込み復帰命令を発行してでも)プロセッサ状態を戻してからスイッチしなければなりませんし、通常のスイッチで保存しないレジスタはスタックなどに保存する必要があります。

ちなみに私も最近
http://www.rakuten.co.jp/tsukumo/435956/754059/
を自宅に買いまして、OpenCoresのZ80やMIPSの互換コアを焼いて遊ぼうかななどと企てているところです。
# 当面は、マイコン用の便利なペリで終わりそうですが...

着手した際には、また情報交換させていただければ幸いです。

よろしくお願いいたします。
Reply to #29481

RE: HOS-v4: MIPSへの移植 (2007-05-07 23:21 by m-arai #29497)

幽霊開発者なm-araiです。
#「と化しつつある」と書きかけてやめました

私はMIPSアーキテクチャを知りませんし、
そして資料も手元にありませんので、
適切なアドバイスすることは出来ません。
#仮にそれらがあってもrosk_tさんの
#「それなりにがんばってみた」成果を見せて
#いただかないことには無理だと思いますが…

んが、敢えて物凄く無責任で○投げな提案を一つ。


TOPPERS/JSPカーネルを眺めてみたらどうでしょうか。


石を投げないで下さい (^^;;
Reply to #29481

RE: HOS-v4: MIPSへの移植 (2007-05-09 02:19 by ryuz #29509)

横槍ですが、m-araiさん御無沙汰しております。Ryuzです。

> TOPPERS/JSPカーネルを眺めてみたらどうでしょうか。

その手があったか!w

 というか、私もTOPPERS/JSPさんのコードを眺めたのは(ちょろっとですが)わりと最近だったりします。(^^;
 でもオープンソースというのはコンパイルして使うだけでなくて、文字通り著作物として読んで楽しむ(勉強する)役目も多いんだなぁ、と改めて実感したしだいです。

 ITRONなんか、組み込み屋にとってはそれ自体いいリファレンスであって、教材なんですよね。
なるべくHOSも読んでくださる方に失礼のないように仕上げたいなぁ(汗汗)

 
> 幽霊開発者な~
まあ、そうおっしゃらず、細く長くよろしくお願いします。組み込み系自体、趣味も業務も含めて、意味細く長い需要を持ったジャンルと思っていますので、ゆっくりやっていければなと思っています。

手元にInterfaceのMIPS特集はあるんですが、頭が追いつかない.... 私もいい機会なんで少し勉強させてもらいたいなと。
よろしくお願いします。

Reply to #29497

幽霊よりご挨拶 (was RE: HOS-v4: MIPSへの移植) (2007-05-10 00:14 by m-arai #29530)

読める、読ませるソースを書くのは大変なことですよね。
#毒電波の発信なら得意なんですけど(--;;;

HOSには大変勉強させていただきました。
思い返せば、H8入門の教材として読み始めたのでした。


幽霊は不滅です。これ以上死にませんし、気づくと
背後にいるものです。(^^)

これからもよろしくお願いします。
Reply to #29509

RE: HOS-v4: MIPSへの移植 (2007-05-17 01:04 by rosk_t #29653)

すんません、出張等で時間がとれず、お返事遅くなり失礼しました。

お二人のアドバイスをもとに、SH2(とH83)の方のソースの遅延ディスパッチの部分を見直してみました。それで腑に落ちない部分が具体的に出てきました。よろしければもう少しお付き合い願えますでしょうか。

タスクA(アイドルタスク)とタスクB(本命タスク)があるとし、タスクAは実行中、タスクBは眠っているとします。タイマ割り込み内でiwup_tskでタスクBが起こされるとします。このとき、割り込みハンドラの中ではCPUに関係なくだいたい以下のような処理が行われると思います。(ただし多重割り込みは考えない)

1: 割り込みが禁止され、割り込みハンドラに入る(割り込み禁止はプロセッサの機能)

2: タスクAで使っていたレジスタをスタックに退避し、さらに割り込み用のスタックに交換する

3: タスク非依存部へ移行(kernel_sta_int)。これはHOS内部の状態変数を書き換えるのみ。

3: 割り込みルーチンの呼び出し(kernel_exe_int)。ユーザが定義した関数を呼び出す。中で割り込み要因を解消。その後、タスクの再スケジュールが行われる。

4:スタックを割り込み用から元のものに戻す。

5: タスクコンテキストに移行(kernel_end_int)。この中でタスクスイッチ(hospac_swi_ctx)が実行される。実行は割り込みハンドラには戻ってこず、そのままタスクBへジャンプする。タスクBはなんか処理をする。

6: タスクBが実行権を明け渡したら、タスクAにスイッチされ、5で実行したhospac_swi_ctxの直後へ復帰。1で入った割り込みハンドラ(kernel_end_int呼び出しの直後)へ戻り、ハンドラから脱出してタスクA(の割り込まれた直後)へ戻る。

疑問なのは、割り込みが許可されるタイミングです。タスクBの実行中にも当然タイマ割り込みがかかって欲しいと思うのですが、5の処理が実行される際、割り込みを許可する部分はあるのでしょうか。SH2,H83ともに、5の処理(の割り込みハンドラから抜ける際)に割り込みマスクの許可設定をしているのは分かるのですが、タスクBに移るときの割り込み許可/禁止(たとえばSH2の割り込み許可ビットと割り込みマスク)はどうなっているのでしょうか。

自分がどこか理解不足なのだと思います。以上のつたない説明で、考え方のおかしいところを指摘いただければ幸いです。MIPSの問題もこの辺だと思います。よろしくおねがいします。

#TOPPERSのソースも手に入れてみました。すいません、僕のレベルではHOSよりもさらに難しいです(;_;)



Reply to #29481

RE: HOS-v4: MIPSへの移植 (2007-05-17 09:00 by ryuz #29657)

お世話になります。Ryuzです。

> 疑問なのは、割り込みが許可されるタイミングです。

5.でタスクBに移った後、割り込みを許可してタスクBが再会されます。また、6の時はタスクBが割り禁してからhospac_swi_ctxを呼んで、タスクAに切り替えてきます。

hospac_swi_ctxを呼ぶのは、サービスコール内のタスクスイッチ時と、割り込み末尾の2種類だけですが、どちらも割り禁で呼び出して、戻ってくると割り禁解除で再会します。

ちょっとわかりにくいですが、いかがでしょうか?

Reply to #29653

RE: HOS-v4: MIPSへの移植 (2007-05-17 21:12 by tkato #29678)

加藤と申します。

MIPS版のタスクスイッチング周りのソースなどの
パッチをポストしていただけると、レビューできる
かも知れません。

MIPSは、4年位前にやったきりでいまいち
覚えてませんが、見れば思い出すかも
しれませんし・・・

P.S.最近やっとH8のボードを組み上げ、IA32じゃない
環境でHOSを実行する環境を用意しました。
#今頃・・・
Reply to #29481

RE: HOS-v4: MIPSへの移植(動きました!) (2007-05-20 23:28 by rosk_t #29726)

ありがとうございます>ryuzさん、tkatoさん。

アドバイスで自分の誤解に気がつきました。やっとタイマ割り込みからディスパッチして動き続けるようになりました!

私の誤解は2つあって、

①hospac_cre_ctx_asmの引数のtaskが、タスク関数の生のアドレスだと思い込んでいた。で、タスクの最初で割り込みを許可しているのはどこだ?と混乱してました。実際は、kernel_task_entryがタスクの最初で、中でmknl_unl_sysを呼んでますね。
②MIPSの割り込み禁止・許可はステータスレジスタのIEビットとEXLビットで制御されることがわかってなかった。割り込み例外のときはEXLビットが割り込みの出入り口で自動的に操作される。hospac_dis_int/hospac_ena_intでIEビットを操作するようにしているなら、遅延ディスパッチの直前ではEXL=0&IE=1とする必要があった。

もう少しこちらで確かめつつソースを整形したら、ぜひhos-v4に入れていただきたいと思いますがいかがでしょうか。よろしくおねがいします。
Reply to #29481

RE: HOS-v4: MIPSへの移植(動きました!) (2007-05-22 00:21 by ryuz #29745)

お世話になります。無事動いた用で何よりです。

人に見ていただくと、いろいろと見えなかったものが見えてきて勉強になりますね。確かにわかりづらい実装になっていますね。


> hospac_cre_ctx_asmの引数のtaskが、タスク関数の生のアドレスだと思い込んでいた。

本来飛び先は一箇所しかないので固定値で埋め込むことは可能なのですが(確かtiny版はそうしてたはず)、ソフト屋の習性で、下位層が上位層に依存するのを避けています。
pac単体でITRON以外の応用も思い描いていたのもあってこうなってます。数サイクル無駄な場合もあるので悩ましところですが、それ以上に下位レイヤーからボトムアップでポーティング頂く方を混乱させてしまっていますね。
# ドキュメント不足だなぁ (^^;;

> もう少しこちらで確かめつつソースを整形したら、ぜひhos-v4に入れていただきたいと思いますがいかがでしょうか。

大歓迎です。オープンソースの醍醐味ですよね。
最近、V4版のメンテに手が回っていないので、ご要望に添えない点も出てくるとは思いますが、まずは公開いただければ喜ぶ人は多いと思います。
# というか多分真っ先に私がV4a版の参考にさせていただきます(笑)

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


Reply to #29726

RE: HOS-v4: MIPSへの移植(動きました!) (2007-05-27 16:30 by rosk_t #29851)

MIPSの動作部分と、簡単なサンプルプログラムをhos-v4へcommitしました。

まだタイマ割り込みしか扱ってないのと、多重割り込みができてないので、これから直す予定です。

アドバイスいただいた方々、ありがとうございました。
Reply to #29745

RE: HOS-v4: MIPSへの移植(動きました!) (2007-05-28 00:26 by m-arai #29856)

MIPS portが一区切り付いたら、久しぶりにリリース
パッケージを作りましょうかね。

今後ともよろしくお願いします。
Reply to #29851

RE: HOS-v4: MIPSへの移植(動きました!) (2007-05-28 06:38 by ryuz #29858)

おはようございます。リリース大臣殿。
# と、役職を既成事実化してみるテスト (^^;

私がブランチでやっていた、act_tsk系のバグ対応どうしましょうか? 他のCPUで確認していないので不安も残るのですが(次のリリースに回そうかなぁ、とも)。
# 開発版と安定版分けることも考えたほうがいいのかなぁ? でも、管理大変だしなぁ。 (^^;

ご意見あれば、よろしくお願いします。
Reply to #29856

次のリリースパッケージについて (2007-05-29 00:09 by m-arai #29874)

折角なので突っ込むべきだと思います。

何故ならば、私の見るところ、時間を置いたから
といって必ずしもそれで他アーキテクチャでの
レポートが揃うという見込みがある訳ではないからです。
#天に向かって何とやら…

むしろここはリリースすることにより、何れにせよ
得るものがあるという可能性に期待したい。

決してリリースワークの手間が増えるから
2系統で出したくない訳ではありません。
出そうという意見や作業を阻む意図はありません。
そうしようという合意が出来て、特に手を
挙げる人がいないなら、パッケージを作って
リリースファイルに置くくらいのことはやります。

期日はそう…SF.jp登録5周年記念に惹かれないことも
ないですが、一月後と決めるとちょっと苦しい?
夏休み中なら時間的余裕はあるかな?

以上、私の意見としてはこんな感じです。
かなり無責任なものいいですが…(^^;;
Reply to #29858

RE: 次のリリースパッケージについて (2007-05-29 08:23 by ryuz #29876)

Ryuzです。
ご意見ありがとうございます。
私もあれから悩んだんですが、ひとまず今回は「えいやー」とマージしちゃった方が逆に混乱がないかなぁ、と思い始めました。
# 2ブランチ開発を仮に検討するにせよ、ルール決めその他、かなり準備がいるよなぁ.. と

いつのまにやら5周年ですか、早いですね (^^)

どこかで時間作って、なんとか間に合うようには努力してみます。
マージ作業で多少リポジトリが荒れるかもしれませんが、ご協力いただければ幸いです。
Reply to #29874

マージしました (2007-05-30 07:41 by ryuz #29904)

Ryuzです。
ひとまず、マージを行いました。

ファイルが増えていますんで、MIPS版のmakefileにも影響が出ると思います。
すいませんがよろしくお願いします > rosk_tさん


V4系のsampleがすぐに試せる環境が手元に立ち上がってなかったりします。 (--;;
余力ある方、おられたら、試していただけると助かります。

よろしくお願いします。


Reply to #29876

RE: マージしました (2007-08-14 11:22 by ryuz #31328)

お世話になっております。Ryuzです。

7月中にとかいいつつ埋没していてごめんなさい。
なんとか盆のうちに少しでも巻き返しを...と。

Ryuz修正分はマージしてそれなりに時間がたちましたが、特に不具合報告も無いようですので、一旦リリースにまわしても良いかなと思っております。

rosk_tさんのMIPS版の続報も待ちたいところではありますが、時間がかかるようなら一旦現状でリリースして、広く意見を集めても良いのでは無いかと思います。

> m-araiさん
余裕ありますか? 厳しいようでしたら私の方でもリリース準備を検討します(というか、やり方忘れている 汗汗)。
Reply to #29904

RE: マージしました (2007-08-15 00:11 by m-arai #31351)

8/15中にRCパッケージが出せるか否か、そしてその
内容で判断してください。

今のCVSからexport、コンフィグレータのmakeを
行うだけになるでしょう。

取り敢えず遠方から帰宅したばかりですので、
寝ます(^^;;
Reply to #31328

RE: マージしました (2007-08-15 21:47 by ryuz #31377)

Ryuzです。レス遅れました。

お忙しいところ対応ありがとうございます。

m-araiさんの手の回る範囲で対応いただければ幸いです。
# 納期があるわけではないので (^^;;

よろしくお願いいたします。m(_ _)m
Reply to #31351

文字コード修正 (2007-05-30 08:03 by ryuz #29905)

pacctx.S が SJISでしたので、EUCに修正しておきました。
次回コミット時にコンフリクトしたらごめんなさい。
Reply to #29851

RE: HOS-v4: MIPSへの移植 (2007-11-11 23:26 by n-okada #33297)

はじめまして、皆様。

semb1200a ユーザーの岡田と申します。
このたび、お仲間に入れていただきまして、ありがとうございました。

HOS-v4 の勉強を始めたばかりですが、よろしくお願いします。 このようなすばらしいHOSを公開いただき、ソースを見ながら勉強できること、うれしく思えます。


さっそくですが、HOS-v4 (ver1.02) を semb1200a に導入してみようかと思ったのですが、次の点で引っかかりました。 3点あり、自分なりの解決をしてみましたので、あわせて記します。

1点目)
 binutils(gas) version 2.18 では、mips のレジスタの表記が $0n が許されていないようです。
エラー回避のため、mipsregs.h の $00-$09 を $0-$9に
変更すると問題が回避できます。

2点目)
 当方も自作のライブラリを作っていて迷ったところですが、メーカーの方から伺った情報をもとに、crt0.c を以下のように変更しております。 目的は、浮動小数点演算処理の安定化です。
 FPの設定を行っています。

crt0.c の asm() 中にて、以下を追記ください。

asm(" .text \n"
" .align 4 \n"
" .global _start \n"
" .ent _start \n"
"_start: \n"
" la $29,_stack_init \n"
" la $28,_gp \n"
" mfc0 $2, $12 \n" // ←ここ追加
" lui $3, 0x0400 \n" // ←ここ追加
" not $3 \n" // ←ここ追加
" and $2, $3 \n" // ←ここ追加
" mtc0 $2, $12 \n" // ←ここ追加
" nop \n" // ←ここ追加
" nop \n" // ←ここ追加
" j _start1 \n"
" .end _start \n" );

3点目は、pacint.Sと割込みベクタを書き換えているcrt0.c についてです。
現時点では、cacheを止めて動いていますが、
割込みベクタ書き換え後、CACHE命令を実行して、
キャッシュフラッシュさせる方法があります。

#define cache(fadrs) ({ \
register int __adrs; \
__asm__ __volatile__ ( \
"li %0,"STR(fadrs)"\n\t" \
"cache 4,0(%0)\n\t" \
"nop\n\t" \
"nop" \
: "=r" (__adrs)); \
})

を crt0.c にて定義いただいて、
割込みベクタを置き換え行ったあとにて、
cache(0xA0000180);
としていただければ、OKです。

以上となります。
Reply to #29481

RE: HOS-v4: MIPSへの移植 (2007-11-12 23:45 by ryuz #33321)

はじめまして、Ryuzです。
MIPSは触ったこと無いのですが、ご挨拶がてら書き込ませていただきます。

どうしてもプロセッサや処理系を増やそうとすると、いろんな方のお力を借りる必要があり、ありがたい限りです。
コミット権限も付与しております。細く長くをモットーにやっておりますので、今後とも気長にお付き合い頂ければ幸いです。

キャッシュ周りの話が出ていますが、ココでは珍しいネタですね。
ココは組み込み屋さん多いので、キャッシュコヒーレンシ系の扱いには慣れてる人も多そうですが、移植性を損なわないようにケアするの難しいんですよね。
# MPUによっては命令セット同じでもメモリアーキがいっぱいあったりするんですよね (^^;;

今回はスタートアップ系なのでMIPSに閉じると思いますが、将来的にはキャッシュ操作APIもカーネルで定義しないといけないかもしれませんね(独自APIになるでしょうけど)。

それでは、今後ともよろしくお願いします。
Reply to #33297

こちらこそよろしくお願いします (2007-11-13 17:27 by n-okada #33334)

Ryuzさん、メッセージありがとうございます。

本業がまったく異なる業界のため、
sourceforge に参加すること、共同でプログラムを
書くことの経験が少ないので、
ご迷惑をおかけすることが多々あるかと思いますが、
よろしくお願いします。
私の力でお役に立てるのであれば幸いです。

# コミット権限、という言葉からしてわからない 素人です (^^;

cache についてですが、
こちらで現在テストをhos-v4環境で行っている限りは
大丈夫そうです。

いまは、hos-v4 で使っているタイマ割込み以外の
割込み処理を付加しようとして、
現在、ソースコードの解読中です。

過去ログを念入りに検索しますが、
何かわからないところがありましたら、
ここで質問させていただきますので、
よろしくお願いいたします。
Reply to #33321

RE: HOS-v4: MIPSへの移植 (2008-06-22 05:18 by n-okada #37292)

ご無沙汰しております、おかだです。

mips(SEMB1200A)への移植その1を[トラッキング]-[patches] に上げてみました。
(どこに置くのが正しいのかわからないまま、置いてしまいました。まずければ、移動 or 削除ください)

今回は、前回のキャッシュ処理をさらに適切に書き直し、浮動小数点演算用レジスタの退避と復帰を記述してみました。
当方でのサンプルでは、ちゃんと動いています。
(といっても、math.h の sin(), sinf() で、double型とfloat型の確認をした程度ですが)

引き続き、例外処理の記述を追記していく予定です。
(次のHOSv4のアップデートに間に合えば良いのですが。。。)
Reply to #33321

RE: HOS-v4: MIPSへの移植 (2008-06-22 20:35 by ryuz #37304)

こんばんは、Ryuzです。

開発ありがとうございます。
浮動小数点対応は、HOS的には初な気がします。

> mips(SEMB1200A)への移植その1を[トラッキング]-[patches] に上げてみました。
>(どこに置くのが正しいのかわからないまま、置いてしまいました。まずければ、移動 or 削除ください)

当方、しばらく時間が取れそうにないので対応遅れそうです。

あまりルールができていないのですが、開発メンバでMIPS環境お持ちなのはrosk_tさんと、n-okadaさんだけかと思いますので、差し支えなければCVSのMIPS関連のディレクトリに関しては直接いじって頂いた方がトラブルも少ない気がします。


以下余談ですが、個人的には今MIPSにかなり興味持っています。
DesignWaveだったかInterfaceだったか、最近FPGAベースのMIPS互換コアの特集があったと思うんですが、FPGA向けのシリコンOSの構想を持ってましてプロセッサの設計を企んでるんですが、基本命令セットはMIPSのサブセットでいきたいなと(コンパイラ作りたくないので)思っていたりします。
まだ構想だけですが、落ち着いたらいろいろと勉強させていただきたいと思っていますのでよろしくお願いいたします。

Reply to #37292

RE: HOS-v4: MIPSへの移植 (2008-06-22 23:00 by rosk_t #37306)

rosk_tです。またまたご無沙汰しています。

早々にcvsに反映すべきだと私も思いましたので、早速おかださんの変更をCVSに入れました。こちらでもサンプルは動きました。

おかださんが、タイマ以外の例外処理等も試して、commitしていただけるそうですので、楽しみにしています。

Reply to #37304

RE: HOS-v4: MIPSへの移植 (2008-06-23 20:01 by n-okada #37321)

おかだです。
cvs の使い方がわかりました。
無駄にアップデートしてしまいました(ごめんなさい)。
一応、Shift-JIS 化しておきました。

今後、自分でやっていきたいと思います。
皆様、お手数をおかけいたしました。
Reply to #37306