SH4でFreeRTOS動きますか?

FreeRTOSのサンプルとしてSH7216が公開されていますが、

それを参考にSH4(SH7763)でFreeRTOSを動かすことは可能でしょうか?

できないことはないとは思うのですが、大変な作業でしょうか。

SH4で動かした実績のある方がいらっしゃいましたら幸いです。

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

  • > 動かすことは可能でしょうか?
    > 大変な作業でしょうか。

    作業する人次第でしょう。
  • 131さん、こんにちは。NoMaYと申します。

    SH4で動かした実績のある人がいないか、忙しくてリプライ出来ないか、といった感じのようなので、SH-2AとSH4のハードウェアマニュアルをざっと見比べてみたのですが、印象としては、1週間ほどの作業ではないかな、といった気がしました。

    ただ、前提として、2020年の今にSH4(SH7763)ということですので、もう既に充分にSH4を使用した開発経験があり、ソースコード資産も充分にあって(難無くmain()の先頭に辿り着けるソースは沢山ある)、ノウハウもバッチリ溜まっている(アセンブラを読み書きするぐらいは(マニュアルを読みながらであれ)難なく出来る)、というぐらいを想定してですけど。

    やることは、SH-2AとSH4のCPUレジスタの種類を見比べて、タスク切り替え時に退避/復帰しなければならないCPUレジスタとして、現存のSH-2AのポートレイヤではケアされていないCPUレジスタに対する退避/復帰を追加する、というものになる筈です。(あと、タスクスタート前にCPUレジスタの初期値を設定している部分に、ケアされていないCPUレジスタに対する初期化を追加すること、です。) ざっと見比べた感じでは、レジスタバンクで複雑になっている部分以外は、そんなに差分は無い印象でした。(コンパイラの通常処理(つまり割り込み処理以外)ではレジスタバンクは使われないと思いましたが、そうではないということであれば結構大きな差分になってしまう、のかも知れませんけれど。)

    今の時代、全部作り込んでからビルドすることは時代遅れでしょうから、まず、現存のSH-2Aのポートレイヤをそのまま使い(ビルドする為の最低限の変更は必要かも知れませんが)、DSP演算も浮動小数点演算もマトリクス演算も使わないようなテストプログラムを作り、タスクスタート前のCPUレジスタの初期化とかタスク切り替え時のCPUレジスタの退避/復帰とか全体的な動作とかデバッガで確認した後、もろもろの処理を追加していくようにするのが良いのではないかな、と思いました。

    [追記]

    SH4にはSSRというものがあるようですね。これは最低限ケアしないと簡単なテストプログラムも動作しないかも知れないです、、、(例外発生時にSRがSSRに退避されるなら、タスク切り替え時に退避/復帰すべきはSRではなくてSSRになるような気がしましたので、、、)

  • hujita nozomu様

    回答ありがとうございます。
    確かにおっしゃる通りですね。
    もし実績がある方がいらっしゃればと思い投稿いたしました。
  • NoMaY様

    回答ありがとうございます、131です。

    まさにSH4を使用した過去の開発環境でFreeRTOSを動かそうとした次第です。
    私個人の技量として十分なノウハウがたまっているとは言えませんが、おっしゃる通りタスクディスパッチ時のレジスタ退避/復元とタスク生成時のレジスタ初期化の部分にたどり着いたところです。基本的にはSH4のマニュアルに記載されている割込み時の処理と同等の処理をすればよいという理解でよろしいのでしょうか。

    また、やり方としてはHewでSH4用のまっさらな環境を作りとりあえずタスクが動くところまでやってみようとしています。
    ご指摘いただいたSSRについても十分理解していないのでそのあたりについても勉強しつつ作業をすすめていきます。

    ご丁寧に回答いただきありがとうございました。
  • 131さん、こんにちは。NoMaYです。

    > 基本的にはSH4のマニュアルに記載されている割込み時の処理と同等の処理をすればよいという理解でよろしいのでしょうか。

    同等というよりは、もっと徹底してレジスタの退避/復帰を行う、という感じです。とは言っても、コンパイラが生成したコードでは触ることが無いようなレジスタに関しては何もしなくて良いです。例えばAというタスクで実行されているコード(Cコンパイラで生成されたコード(ライブラリ含む))が、突然Bというタスク(これもCコンパイラで生成されたコード(ライブラリ含む)が実行される)に切り替わろうとした時、のちのちAというタスクに戻った時にCコンパイラで生成されたコード(ライブラリ含む)が正しく実行再開されるようになっていれば良い/正しく実行再開されるようになっていなければならない、という考え方になるかと私は思っています。(なにやら禅問答みたいですが。)

    ただ、皆さん割り切っている部分もあるかと思います。例えば、C言語標準ライブラリのerrnoという変数ですが、拘るならば、この変数(つまりCPUレジスタでは無くメモリの一部)も退避/復帰しないとC言語ライブラリ(というかそれを使うユーザプログラム)が誤動作してしまいます。一応、FreeRTOS kernel内ではconfigUSE_POSIX_ERRNOというdefine次第で退避/復帰をさせるように出来るみたいです(今しがたgrepしたばかりで勘違いしているかも知れません)が、RXやRL78では利用していないです。

  • NoMay様

    131です、ご回答ありがとうございます。

    >同等というよりは、もっと徹底してレジスタの退避/復帰を行う、という感じです。
    基本的な概念としては理解しているのですが、SH4における具体的なレジスタについてはまだ理解しきれていないところなので、CPUのマニュアルを見ながらやってみたいと思います。

    errnoライブラリは使用しておりませんが頭にいれておきたいと思います。
    進展がありましたらご報告させていただきます。
    ありがとうございました。