SH4でFreeRTOS動きますか?

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

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

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

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

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

Parents
  • 131さん、こんにちは。NoMaYです。

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

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

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

Reply
  • 131さん、こんにちは。NoMaYです。

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

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

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

Children
  • NoMay様

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

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

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