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

  • NoMaYさん

    こんにちは、シェルティです。

    本件も引き続き相談させていただければ幸いです。

    AWS本家のリポジトリにプルリクエストを出してマージしてもらうところまで進めていきたいと考えています。

    数年前はFreeRTOSの活動は空き時間で細々とやっていましたがかなりリソース増強出来てきました。

    実商談ベースの調整やOTA対応やセルラー対応等の本筋にリソースを割いていましたが、GitHub上でもっと幅広くサンプルを展開していけるようにする活動にもフォーカスが移りつつあります。

    RL78/G23用も含めてGitHub上のFreeRTOS関連のコードの整理を進めてまいります。

    e2 studioがGitHubを参照して初期データセットを持ってきて、新規プロジェクト作成でFreeRTOSが選べるようにしたりなど、ツール連携の強化も合わせて進めてます。

    以上です

  • シェルティさん、こんにちは。NoMaYです。

    > 本件も引き続き相談させていただければ幸いです。
    > AWS本家のリポジトリにプルリクエストを出してマージしてもらうところまで進めていきたいと考えています。

    はい。では、随時。

    ちなみに、RL78スマートコンフィグレータのR_BSPは、CC-RL/ICCRL78/LLVM-RL78の3コンパイラ対応になってますね。(言い換えると、GNURL78はレガシーコンパイラの扱いになった、みたいですね。) e2 studio 2021-04を触っていて気付いたのですが、将来的にRL78のFreeRTOSプロジェクトがコロコロすっとんと生成出来るようになることの他に、FITのRL78版みたいな位置付けのフレームワークも提供されるのかなぁ、とか思ったりとか思わなかったり、とか、、、

  • こんにちは。NoMaYです。

    RL78/G14でのRL78コード生成機能を使ったFreeRTOS RTOSDemoをRL78/G23でのRL78スマートコンフィグレータを使ったものへと移植し始めたのですが、ひとまず動くようにはなりました(まだCC-RLのみです)、、、 いつものことですが、ここからが長くて、いろいろコードを整理して、ちゃんとした感じになるのは再来週ぐらいかなぁ、と思います、、、

    RL78/G23 FPBに搭載のR7F100GLGは、RL78/G14 FPBに搭載のR5F104MLより、かなりRAMが小さく、RTOSDemoで使っていたRAMサイズを割り込んでいたことに気付いたので、RTOSDemoの項目のどれをどう削ろうかちょっと悩ましいです、、、

  • こんにちは。NoMaYです。

    EWRL78がRL78/G23対応したようです。

    IAR Embedded Workbench for Renesas RL78
    www.iar.com/jp/products/architectures/renesas/iar-embedded-workbench-for-renesas-rl78

    最新リリースノート
    Version 4.21

    ・ RL78/G23 microcontroller group support
      The RL78/G23 group of microcontrollers is now supported.

    ・ Renesas Smart Configurator included
      The Renesas RL78 Smart Configurator V1.0.1 has been included.


    [余談]

    IAR RL78 C/C++コンパイラのLinux版も出たようですね。これでLinux版はARM, RH850, RX, RL78の4つでしょうか、、、

    最新リリースノート
    Version 4.21

    ・ IAR Build Tools for Linux
      A new product, IAR Build Tools for Renesas RL78, is available. It requires a separate product license and is distributed as a Debian package for Ubuntu containing the IAR C/C++ Compiler, IAR Assembler, Linker and library tools, C-STAT, IARBuild, and runtime libraries. Get product info

  • こんにちは。NoMaYです。

    別スレッドのRL78/G23 Blinky sample programでRL78スマートコンフィグレータが生成したCC-RL版ソースとLLVM-RL78版ソースを比較していて、(率直に言って)頭を抱え込んでしまったのですが、なぜこんな違いがあるのさ?、と、、、

    (1) インクルードファイルの順番が違う!(LLVM-RL78版が今までのコード生成機能と(RXスマートコンフィグレータとも)同じ)
    (2) #include群と#pragma群の順番が違う!(CC-RL版が今までのコード生成機能と同じ)

    以下、ファイル比較ツールの画面コピーです。


     

  • こんにちは。NoMaYです。

    RL78スマートコンフィグレータが生成したCC-RL版ソースとLLVM-RL78版ソースを比較していて、もうひとつ奇妙なのは、以下の点です。

    (3) インクルードガードの位置が違う!(CC-RL版のインクルードガードの位置は特殊な事情がある時の変則的書き方では?)

    以下、ファイル比較ツールの画面コピーです。


     

  • こんにちは。NoMaYです。

    あと、今までのRL78コード生成機能からRL78スマートコンフィグレータへのAPIの置き換えで、ちょっと首を傾げているのですが、DTCのAPIの幾つかは何故 '_Config_' が付いていないのだろう?、、、

    今回のRL78スマートコンフィグレータのAPI

    void R_Config_DTC_Create(void);
    void R_DTCD0_Start(void);
    void R_DTCD0_Stop(void);
    void R_Config_DTC_Create_UserInit(void);

     
    従来のRL78コード生成機能のAPI

    void R_DTC_Create(void);
    void R_DTCD0_Start(void);
    void R_DTCD0_Stop(void);

     
    他方、INTCは以下のようにどれにも'_Config_'が付いていました、、、

    今回のRL78スマートコンフィグレータのAPI

    void R_Config_INTC_Create(void);
    void R_Config_INTC_INTP0_Start(void);
    void R_Config_INTC_INTP0_Stop(void);
    void R_Config_INTC_Create_UserInit(void);

     
    従来のRL78コード生成機能のAPI

    void R_INTC_Create(void);
    void R_INTC0_Start(void);
    void R_INTC0_Stop(void);

     

  • こんにちは。NoMaYです。

    先ほどのDTCのAPIの関数名の件ですが、ドキュメントの記載は以下の画面コピーの通りでした。ドキュメントが出来た時点で、個別のAPIのページの記載とAPIの使用例のページで、APIの関数名がちょっとちぐはぐだったっぽいですね。

    これは、以下のような流れだったのではないかなぁ、という気がするのですが、、、(想像力が逞しすぎるかも、、、)

    (A) API仕様書を書いた人は、{Config_DTCDn}の部分はユーザに入力させるつもりだった
    (B) GUI仕様書を書いた人は、GUIの詳細はコード生成機能に従えばよい、とした
    (C) プログラマは、コード生成機能のGUIに{Config_DTCDn}をユーザ入力させる機能が無いことには気付いていた
    (D) この3者の間で話し合いがつかず、プログラマは仕様を変更して開発作業を終了した

    スマート・コンフィグレータ ユーザーズマニュアル RL78 API リファレンス編
    www.renesas.com/jp/ja/document/man/smart-configurator-users-manual-rl78-api-reference




    他方、INTCの方は、ドキュメントの記載は以下の画面コピーの通りでした。




     

  • こんにちは。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

     

  • こんにちは。NoMaYです。

    RL78/G14でのRL78コード生成機能を使ったFreeRTOS RTOSDemoをRL78/G23でのRL78スマートコンフィグレータを使ったものへと移植し始めて、CC-RL版、GNURL78版、ICCRL78版、に続き、LLVM-RL78版にも着手することにしました。多少は動くようになったので、コードサイズを比較してみたら滅茶苦茶デカくなっていました、、、プレビルドライブラリの問題?集計方法の問題?純粋に生成コードの問題?など考えられますが、今後の作業課題のひとつ、でしょうか、、、

    2021/05/12での結果(LLVM-RL78とGNURL78は同一集計対象だと思われるが、CC-RLとICCRL78は集計対象が若干異なると思われます)

    LLVM-RL78   53644バイト
    GNURL78     24872バイト
    CC-RL       15919バイト
    ICCRL78     15246バイト


    以下、画面コピーです。