SmartConfiguratorでlibraryを作るやり方を試してみた

こんにちは。NoMaYです。#2連投の1つ目です。

どうやればRXスマートコンフィグレータで生成したソースを使ってCC-RXのライブラリファイル(libファイル)を作れるか試してみました。まだ、ライブラリを使う側で、本意でないobjファイルをリンクする必要があったり、よく分からないリンクワーニングメッセージが表示されたり、といった点はありますけれども、プロジェクトのファイル一式を以下のzipファイルに固めました。

rxsc_ccrx_lib_20220114.zip
rxsc_ccrx_lib_20220114_2.zip    実行プロジェクト側でmcu_interrupts.objのリンクを削除しました

手順は次の投稿の通りです。(e2 studioの画面コピーがあります。)

以下、e2 studioの画面コピーの1つです。


 

  • こんにちは。NoMaYです。#2連投の2つ目です。

    手順は次の通りです。

    第一段階
    (11) 素朴にCC-RXライブラリプロジェクトを作る
    (12) 素朴にCC-RX実行形式プロジェクト(RXスマートコンフィグレータ使用)を作る

    第二段階
    (21) ライブラリプロジェクトのソース(プロジェクトウィザードで作成されたもの)を削除する
    (22) 実行形式プロジェクトのRXスマートコンフィグレータで生成されたソースを削除する
    (23) 実行形式プロジェクトのscfgファイルをライブラリプロジェクトへ移してリネームする
    (24) ライブラリプロジェクトのscfgファイルでRXスマートコンフィグレータを開いてソースを生成する

    第三段階
    (31) 必要に応じてライブラリプロジェクトのコンパイルオプションを変更する(少なくともC99オプションは必要)
    (32) ライブラリプロジェクトをビルドする
    (33) 必要に応じて実行形式プロジェクトのコンパイルオプションを変更する(こちらはC99オプションは設定済み)
    (34) 実行形式プロジェクトのリンクオプションでライブラリプロジェクトの以下のlibとobjをリンクするように設定する

    resetprg.obj
    dbsct.obj
    vecttbl.obj
    mcu_interrupts.obj[追記]試行錯誤していた時の名残りで削除し忘れていましたが不要です
    TestCCRXSCLib.lib

    (35) 必要に応じて実行形式プロジェクトのソースを変更する
    (36) 実行形式プロジェクトをビルドする

    以下、e2 studioの画面コピーです。

    第一段階
    (11) 素朴にCC-RXライブラリプロジェクトを作る
    (12) 素朴にCC-RX実行形式プロジェクト(RXスマートコンフィグレータ使用)を作る





    第二段階
    (21) ライブラリプロジェクトのソース(プロジェクトウィザードで作成されたもの)を削除する
    (22) 実行形式プロジェクトのRXスマートコンフィグレータで生成されたソースを削除する
    (23) 実行形式プロジェクトのscfgファイルをライブラリプロジェクトへ移してリネームする
    (24) ライブラリプロジェクトのscfgファイルでRXスマートコンフィグレータを開いてソースを生成する




    第三段階
    (31) 必要に応じてライブラリプロジェクトのコンパイルオプションを変更する(少なくともC99オプションは必要)
    (32) ライブラリプロジェクトをビルドする
    (33) 必要に応じて実行形式プロジェクトのコンパイルオプションを変更する(こちらはC99オプションは設定済み)
    (34) 実行形式プロジェクトのリンクオプションでライブラリプロジェクトの以下のlibとobjをリンクするように設定する

    resetprg.obj
    dbsct.obj
    vecttbl.obj
    mcu_interrupts.obj[追記]試行錯誤していた時の名残りで削除し忘れていましたが不要です
    TestCCRXSCLib.lib

    (35) 必要に応じて実行形式プロジェクトのソースを変更する
    (36) 実行形式プロジェクトをビルドする







     

  • こんにちは。NoMaYです。

    補足です。実行形式プロジェクトのリンクでは、resetprg.obj以外の2つのobjファイルはリンクしないと以下のリンクエラーになりますが、resetprg.objファイルはリンクしなくてもビルドも出来て実行も出来ます。実は、resetprg.objをリンクしたのは、後々のコンパイル/リンクの最適化を強くする必要が出てきた場合のことを気にしてリンクするようにしたものです。具体例は、以下のスレッドにあります。

    dbsect.objを実行形式プロジェクトでリンクしなかった場合の実行形式プロジェクトのリンクエラー、及びdbsect.cの例

    E0562132:Cannot find "D_2" specified in option "rom"

     
    github.com/renesas/rx-driver-package/blob/master/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/all/dbsct.c

    vecttbl.objを実行形式プロジェクトでリンクしなかった場合の実行形式プロジェクトのリンクエラー、及びvecttbl.cの例

    E0562133:Cannot find defined symbol "_undefined_interrupt_source_isr" in option "vect"

     
    github.com/renesas/rx-driver-package/blob/master/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/rx72n/vecttbl.c

    resetprg.obj(resetprg.c)が関係してくる最適化のスレッド

    CC-RXの未使用の変数/関数を削除する最適化の効き目がGNURX/ICCRXより歴然と弱いのですが、、、
    japan.renesasrulz.com/cafe_rene/f/forum21/6403/cc-rx-gnurx-iccrx

    RX MCUのROM/RAM usage sizeがRenesas QuickConnect IoTのsample programでボロ負け(very worse than)している件(RA MCUやRL78 MCUに比べて)
    japan.renesasrulz.com/cafe_rene/f/analog/7575/rx-mcu-rom-ram-usage-size-renesas-quickconnect-iot-sample-program-very-worse-than-ra-mcu-rl78-mcu
     

  • こんにちは。NoMaYです。

    また補足です。vecttbl.objとdbsect.objを実行形式プロジェクトのリンク設定で指定したく無い場合、以下の記述を実行形式プロジェクトのソースの1つに記述すれば良いです。(なお、まだリンクワーニングは残ります。これはどうするのが良いのか後で考えます。)

    #include <stdint.h>

    extern void (* const Reset_Vector[])(void);
    void (* const * const link_helper_vecttbl_obj)(void) = Reset_Vector;
    extern const uint32_t deadSpace;
    const uint32_t * const link_helper_dbsct_obj = &deadSpace;

     
    以下、e2 studioの画面コピーです。


     

  • こんにちは。NoMaYです。

    実行形式プロジェクトのリンクワーニングは以下なのですが、BSPモジュールのソースは以下のURLのリンク先の内容となっており、以下のCC-RXのヘルプの画面コピーのものと該当部分は同等なので、たぶん、このソースがライブラリ化されることはCC-RXとして想定外だった(そうするとDuplicate symbolのリンクワーニングになる)、ということかなぁ、という気がして来ました。そこで、このソースはライブラリから除外しようかと思います。

    W0561320:Duplicate symbol "__Files" in "…略…\TestCCRXSCLib\Debug\TestCCRXSCLib.lib(lowsrc)"
    W0561320:Duplicate symbol "__Files" in ".\TestCCRXSCLib_DbgExe.lib(_files)"

     
    github.com/renesas/rx-driver-package/blob/0331292/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/all/lowsrc.c#L130




     

  • こんにちは。NoMaYです。

    実行形式プロジェクトのリンクワーニングには以下のように対処することにしました。

    (1) lowsrcモジュールをライブラリプロジェクトのビルド後処理でライブラリファイルから取り除く
    (2) lowsrc.objを実行形式プロジェクトでリンクする

    このやり方では、下回り開発チームからアプリケーション開発チームへと引き渡す物件としては、libファイルとresetprg.objとlowsrc.objと下回り開発チームで開発されたAPIのヘッダファイル一式といったものになります。

    プロジェクトのファイル一式を以下のzipファイルに固めました。

    rxsc_ccrx_lib_20220117.zip

    以下、e2 studioの画面コピーとビルド後処理のコマンドです。

    rlink -nologo -library=${ProjName}.lib -delete=lowsrc -form=lib -output=${ProjName}.lib

     





    [追記]

    resetprgモジュールもライブラリプロジェクトのビルド後処理でライブラリファイルから取り除いてしまっても良かったかも知れません。

  • こんにちは。NoMaYです。

    RXスマートコンフィグレータで生成したソースを使ってCC-RXのライブラリファイル(libファイル)を作る場合に気になる点に気付きました。

    気になる点

    ・ (FITモジュールやCGコンポーネントのソースの構造に依存しますが)割り込みベクタが設定されないものがあるかも知れません

    理由

    ・ 割り込みベクタが記述されたソースファイルのどの関数もどの変数も、アプリケーション側コードから直接的にも間接的にも使われることが無い状況が発生する(そのFITモジュールやCGコンポーネントが使われているのにも関わらず)という可能性のあるソースの構造になっていた場合、そのような状況になると、ライブラリファイルというものの仕様として、割り込みベクタが記述されたそのソースファイル(というかオブジェクトファイル(というかライブラリモジュール))がリンク対象から除外される為です

    対処方法

    ・ そういう状況が発生しないように、「ライブラリ全体の初期化関数」といった感じの名目の関数を用意するようにして、その関数の中で、割り込みベクタが記述されたソースファイルの何かしらの関数か何かしらの変数を直接的にせよ間接的にせよ必ず使用する、ように下回り側のAPIライブラリを設計してしておく

    補足

    ・ RXマイコンの初期の頃にはPDG2というバイナリライブラリが提供されていましたが、たぶんこのようなことが起きないように注意して開発されていたのではないかと思うのですが、FITやCGになってからはアプリケーション側コードと一体でビルドされるようになって、このようなことはケアされなくなっていると思うのです

  • こんにちは。NoMaYです。

    幾つか前の投稿にて、以下のコードをアプリケーション側のソースに記述して貰うようなことを書きましたが、アプリケーション側コードが直接的にせよ間接的にせよ必ず使わなければならない関数や変数が定義されている下回り側のAPIライブラリのソース内に記述しても同様な作用があります。(アプリケーション側プロジェクトでvecttbl.objとdbsect.objを実行形式プロジェクトのリンク設定で指定しなくて良い、という作用があります。)

    #include <stdint.h>

    extern void (* const Reset_Vector[])(void);
    void (* const * const link_helper_vecttbl_obj)(void) = Reset_Vector;
    extern const uint32_t deadSpace;
    const uint32_t * const link_helper_dbsct_obj = &deadSpace;

     

  • こんにちは。NoMaYです。

    以下の別スレッド(というか発端となったスレッド)にて、アドバイスがあった通り、まず実行形式プロジェクトとしてプロジェクトを作成しておき、プロジェクトのプロパティでライブラリプロジェクトへ変更する方法でもRXスマートコンフィグレータで生成したソースを使ってCC-RXのライブラリファイル(libファイル)を作ることが出来ました。

    スマートコンフィグで出力されるコードのパスを変更したい
    japan.renesasrulz.com/cafe_rene/f/forum5/7832/thread/40862#40862

    以下、e2 studioの画面コピーです。