FreeRTOSのRL78のsample programを作成していこうかと思います(RL78/G13,G14の他にRL78/G23もやろうかと思います)

こんにちは。NoMaYです。

今までちょこちょことRL78ポートレイヤを改造していると書いてましたが、サンプルプログラム(もっとも今のところRL78/G14のドライバ層のみです)も作成していたりします。既作成分はGitHubの以下のリポジトリにおいてあります。今日、RL78/G23が発表されましたので、RL78/G23のサンプルプログラムもこのリポジトリに追加していこうかと思っています。(あと、RX23Wも追加していこうかと思っています。)

github.com/NoMaY-jp/FreeRTOS_examples_for_Renesas_R_CPUs

なお、このリポジトリで使用しているポートレイヤはFreeRTOS公式リポジトリのポートレイヤから改造しています。(RL78だけでなくRXも改造しています。)

RL78ポートレイヤ改造概要

(1) タスクスタックとは別に割り込み専用スタックを使用することが可能
(2) カーネル内(とユーザタスク内)のクリティカルセクションの実行中も(多重)割り込みを受け付けることが可能(FreeRTOS APIの呼び出しは不可)
(3) 従来のコード生成機能で生成した割り込み処理Cソース中からFreeRTOS APIの呼び出しが可能(RL78スマートコンフィグレータは今後調査します)

今のところ以下のフォルダがありますが、チョコさんのUARTリングバッファ/簡易IICマスタ/IICAマスタのサンプルプログラムのソースを殆どそのままに近い形で使わせて頂いているものもあります。

13_RTOSDemo
20_UART_9600bps_Basic
26_UART_2Mbps_Tx_DTC_Rx_RingBuffer ← チョコさんのUARTリングバッファのソースを使用
30_I2C_Simple_Master_100Kbps_Basic
31_I2C_Simple_Master_100Kbps_Advanced ← チョコさんの簡易IICマスタのソースを使用
32_I2C_Simple_Master_1Mbps_Basic
33_I2C_Simple_Master_1Mbps_Advanced ← チョコさんの簡易IICマスタのソースを使用
40_I2C_100Kbps_Basic
41_I2C_100Kbps_Advanced ← チョコさんのIICAマスタのソースを使用
42_I2C_1Mbps_Basic
43_I2C_1Mbps_Advanced ← チョコさんのIICAマスタのソースを使用

[追記]

RXポートレイヤ改造概要

(A) RX100,RX200,RX600,RX600v2,RX700v3_DPFPUをひとつにマージ(ただしRX100のTICKLESS IDLEという機能は手が回らず未マージ)
(B) IARコンパイラでもCC-RX/GNURXと同様にFreeRTOSConfig.hのみでコンフィグレーション可能(従来はもう1つASM用にファイルが必要だった)

すみません、RXのRTOSDemoは後日FITベースからCGベースへ変更予定です。(まったくの私の好みによるもの、であって、FITに問題があったから、とかでは全然ありません。)
 

Top Replies

Parents
  • こんにちは。NoMaYです。

    RL78/G14でのRL78コード生成機能を使ったFreeRTOS RTOSDemoをRL78/G23でのRL78スマートコンフィグレータを使ったものへと移植し始めて、CC-RL版に続き、GNURL78版とICCRL78版も動くようになりました。(まだ、ちょっと汚いソースですけれど。)

    次は、LLVM-RL78版ですが、ポートレイヤのソースを新規に起こさないといけないので、来月以降に遅らせるかも知れません。というのは、コンパイラが生成したコードのABIがGNURL78規則からCC-RL規則になって、アセンブラソースの処理をCC-RLと同じにしないといけないのですが、アセンブラソースの文法はGNURL78のままなので、両者を足して2で割ったソースを新規に起こさないといけないからです。(もっとも、足して2で割る、程度なら億劫がらずにやれば良いのでは、とも思いますので、どうしようかなぁ、というところです。)

    ちなみに、RL78/G14→RL78/G23で頭を悩ませているのは以下の点です、

    (1) RL78スマートコンフィグレータ+e2 studioはiodefine.hのインクルードパスを消してしまう(実はRXスマートコンフィグレータも同様)

    ポートレイヤのソースやFreeRTOSConfig.hでiodefine.hをインクルードしていたのですが、代わりにplatform.hを使うようにということでしょうけど、残念ながら、BSPのモジュールのiodefine.hのあるフォルダへのインクルードパスは手作業で追加しても次のコード生成時に強制的に削除されてしまいます。

    RXマイコンでのAmazon FreeRTOSの移植時に気付いたことで、(きっと)そういう設計思想なのだろうなぁ、と(自分で)判断して、RXポートレイヤの方を書き換えたのですが、今回もRL78ポートレイヤを同じ様な発想で何かしら書き換えることになりそうです。

    (2) RL78/G23の32bitインターバルタイマ割り込み処理では他の割り込み処理に無い特有のおまじないコードが必要

    FreeRTOSのTick割り込み生成を、RL78第1世代での12bitインターバルタイマから、RL78第2世代での32bitインターバルタイマへ、変更しました。ただ、32bitインターバルタイマは、32bit×1本として使う他にも8bit×4本や16bit×2本としても使えるようになっていて、そのせいで初期化コードが面倒になっていることは仕方が無いとしても、加えて割り込み処理内でITLS0というレジスタをゼロクリアしないと後続のインターバルタイマ割り込みが受け付けられないという仕様になっていたのでした。

    初期化が面倒になったことに比べれば、ITLS0というレジスタのゼロクリアの追加など何でも無さそうですけど、実は、初期化コードはCソース中にあるのですが、RL78ポートレイヤのTick割り込み処理はASMソースからFreeRTOS共通処理を呼ぶようになっていて、かつ、CC-RLだけCスタイルの#includeや#defineや#if~#else~#endifが使えなくて僅か1行の処理の切り替えですが他のICCRL78/GNURL78/LLVM-RL78とは別の機構を考えなくてはいけなくて、それが悩ましいです。

    (3) RL78/G23 FPBに搭載のR7F100GLGは、RL78/G14 FPBに搭載のR5F104MLより、かなりRAMが小さい

    RL78/G23 FPBのR7F100GLGはRAMが16384バイト、RL78/G14 FPBのR5F104MLはRAMが49152バイト、ですので、かなりRAMが小さいです。(もちろん、数十年前の感覚ではRAMが16384バイトもあるのを小さいと言うのは変ですけど、IoT向け32bitマイコンとして目にするものは、RAMが数百Kバイトあるのはごく普通の光景、だったりしますので、、、)

    そのせいでRTOSDemoで使っていたRAMサイズを割り込んでいて、RTOSDemoの項目を削らないとリンク時にRAM容量不足でリンクエラーになってしまいます。RTOSDemoをデモプログラムとしてだけ見れば項目を削れば良いだけのことですけど、実はテストプログラムの側面もあるので出来れば削りたくない(むしろ増やしたいぐらい)と思っていたりします、、、

    昔のFull機能ICEやシミュレータでは実デバイス以上のRAMを一時的に使えるようにする機能があったのですが、最近のRL78シミュレータでも出来るのかな、、、

    [追記]

    今回のFreeRTOS RTOSDemoの移植中に、「あっ、しまった、『後で仕組みを考えよう』と思ったものの、そのまま忘れていた」箇所を思い出しました。RL78第1世代での12bitインターバルタイマには、ベクタアドレスが異なる2タイプがあるのですが、ICCRL78とGNURL78ではiodefine.hに相当するファイルをASMソースでインクルード出来ますので、その内容で自動判別していたのに対して、CC-RLではそれが出来なくて、以下のように手作業でコメントアウトする応急処置で済ませていたのでした、、、ちゃんとした感じのものに直さなきゃ、です、、、

    FreeRTOS/Source/portable/Renesas/RL78/ISR_Support.h

    ;;$include "FreeRTOSConfig.h"
        configTICK_VECTOR    .SET    0x38
    ;;    configTICK_VECTOR    .SET    0x3C

     

Reply
  • こんにちは。NoMaYです。

    RL78/G14でのRL78コード生成機能を使ったFreeRTOS RTOSDemoをRL78/G23でのRL78スマートコンフィグレータを使ったものへと移植し始めて、CC-RL版に続き、GNURL78版とICCRL78版も動くようになりました。(まだ、ちょっと汚いソースですけれど。)

    次は、LLVM-RL78版ですが、ポートレイヤのソースを新規に起こさないといけないので、来月以降に遅らせるかも知れません。というのは、コンパイラが生成したコードのABIがGNURL78規則からCC-RL規則になって、アセンブラソースの処理をCC-RLと同じにしないといけないのですが、アセンブラソースの文法はGNURL78のままなので、両者を足して2で割ったソースを新規に起こさないといけないからです。(もっとも、足して2で割る、程度なら億劫がらずにやれば良いのでは、とも思いますので、どうしようかなぁ、というところです。)

    ちなみに、RL78/G14→RL78/G23で頭を悩ませているのは以下の点です、

    (1) RL78スマートコンフィグレータ+e2 studioはiodefine.hのインクルードパスを消してしまう(実はRXスマートコンフィグレータも同様)

    ポートレイヤのソースやFreeRTOSConfig.hでiodefine.hをインクルードしていたのですが、代わりにplatform.hを使うようにということでしょうけど、残念ながら、BSPのモジュールのiodefine.hのあるフォルダへのインクルードパスは手作業で追加しても次のコード生成時に強制的に削除されてしまいます。

    RXマイコンでのAmazon FreeRTOSの移植時に気付いたことで、(きっと)そういう設計思想なのだろうなぁ、と(自分で)判断して、RXポートレイヤの方を書き換えたのですが、今回もRL78ポートレイヤを同じ様な発想で何かしら書き換えることになりそうです。

    (2) RL78/G23の32bitインターバルタイマ割り込み処理では他の割り込み処理に無い特有のおまじないコードが必要

    FreeRTOSのTick割り込み生成を、RL78第1世代での12bitインターバルタイマから、RL78第2世代での32bitインターバルタイマへ、変更しました。ただ、32bitインターバルタイマは、32bit×1本として使う他にも8bit×4本や16bit×2本としても使えるようになっていて、そのせいで初期化コードが面倒になっていることは仕方が無いとしても、加えて割り込み処理内でITLS0というレジスタをゼロクリアしないと後続のインターバルタイマ割り込みが受け付けられないという仕様になっていたのでした。

    初期化が面倒になったことに比べれば、ITLS0というレジスタのゼロクリアの追加など何でも無さそうですけど、実は、初期化コードはCソース中にあるのですが、RL78ポートレイヤのTick割り込み処理はASMソースからFreeRTOS共通処理を呼ぶようになっていて、かつ、CC-RLだけCスタイルの#includeや#defineや#if~#else~#endifが使えなくて僅か1行の処理の切り替えですが他のICCRL78/GNURL78/LLVM-RL78とは別の機構を考えなくてはいけなくて、それが悩ましいです。

    (3) RL78/G23 FPBに搭載のR7F100GLGは、RL78/G14 FPBに搭載のR5F104MLより、かなりRAMが小さい

    RL78/G23 FPBのR7F100GLGはRAMが16384バイト、RL78/G14 FPBのR5F104MLはRAMが49152バイト、ですので、かなりRAMが小さいです。(もちろん、数十年前の感覚ではRAMが16384バイトもあるのを小さいと言うのは変ですけど、IoT向け32bitマイコンとして目にするものは、RAMが数百Kバイトあるのはごく普通の光景、だったりしますので、、、)

    そのせいでRTOSDemoで使っていたRAMサイズを割り込んでいて、RTOSDemoの項目を削らないとリンク時にRAM容量不足でリンクエラーになってしまいます。RTOSDemoをデモプログラムとしてだけ見れば項目を削れば良いだけのことですけど、実はテストプログラムの側面もあるので出来れば削りたくない(むしろ増やしたいぐらい)と思っていたりします、、、

    昔のFull機能ICEやシミュレータでは実デバイス以上のRAMを一時的に使えるようにする機能があったのですが、最近のRL78シミュレータでも出来るのかな、、、

    [追記]

    今回のFreeRTOS RTOSDemoの移植中に、「あっ、しまった、『後で仕組みを考えよう』と思ったものの、そのまま忘れていた」箇所を思い出しました。RL78第1世代での12bitインターバルタイマには、ベクタアドレスが異なる2タイプがあるのですが、ICCRL78とGNURL78ではiodefine.hに相当するファイルをASMソースでインクルード出来ますので、その内容で自動判別していたのに対して、CC-RLではそれが出来なくて、以下のように手作業でコメントアウトする応急処置で済ませていたのでした、、、ちゃんとした感じのものに直さなきゃ、です、、、

    FreeRTOS/Source/portable/Renesas/RL78/ISR_Support.h

    ;;$include "FreeRTOSConfig.h"
        configTICK_VECTOR    .SET    0x38
    ;;    configTICK_VECTOR    .SET    0x3C

     

Children
No Data