RX SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド

こんにちは。NoMaYです。

過去にも同じようなスレッドを立てていましたが、CC-RXとGNURXで2つ立てていて、スレッドを使い分けるのも少し不便な気がしましたので、両者を区別せず投稿するスレッドを立ててみました。(e2 studioのプラグイン版もCS+の単体版もいっしょくたです。)

CS+でTB-RX140を使おうとして、単体RXスマートコンフィグレータ V2.10.0では未対応だったことに気付き、アップデートマネージャを起動してみたところ、V2.11.0がリリースされていましたのでアップデートしました。V2.11.0を触っていて気付いたのですが、CGコンポーネントのコードを再生成させた時、変更の無いソースファイルは再生成されなくなり、ファイルのタイムスタンプが変わらないようになっていました。

この挙動が設計意図なのか何かの拍子にそうなってしまっただけなのかは分からないのですが、再コンパイルする時間の短縮になるかも!と思ったのも束の間、以下の2つのファイルが変更が無くても毎回再生成されるので、思惑通りにはならないことに気付きました、、、以下の2つのファイルに関しても同様に変更の無い場合にはファイルを再生成しないように出来ないものでしょうか、、、

(1) platform.h (実は何故このファイルがコード再生成時に毎回タイプスタンプが更新されるのか不思議です)
(2) r_bsp_config.h (RX140の場合このファイルだけですがRX671とかの場合はr_bsp_interrupt_config.hもかもです)

[余談]

以下のニュース記事を読んでいて以下の解説に気付きました。ルネサスさんの取締役の人たちはソフトウェア開発ツールも含んで話をされていたのかな、、、まあ、過去形では無くて永遠に現在進行形であるべきテーマですね。(もっとも、Automotive部門の人の話だったようですけれども、、、)

新しい方向性を見出して走り出したルネサス、Progress Updateから見えたもの
2021/10/01 16:37 著者:大原雄介
news.mynavi.jp/article/20211001-1988188/

さてそのIIBUの大きな柱がMCUであることは論を待たないが、2025年までに大幅にシェアを引き上げる、としている(Photo19)。
。。。
これについては、後のAutomotive向けの質疑応答の中で出てきた話ではあるのだが、そもそもルネサスのMCUが使われなかったのは、1つは「良いかもしれないけど使いにくい」という部分があり、こうした部分を徹底的に改善した事で顧客に使って貰いやすくなったという回答があり、これはIIBUにもおそらく共通する話であろうかと思う。

  • こんにちは。NoMaYです。

    またもうひとつ気になるのは、今度はRXスマートコンフィグレータとも関係しますけれども、以下でR_Pins_Create()を呼び出しているのは適切なのでしょうか?R_Pins_Create()はCGコンポーネント向けの端子初期化関数、かつ、使途不明(以前に以下のスレッドで話題にしたことがあります)なのですが、このプロジェクトではCGコンポーネントを一切使用していませんので(厳密にはCGコンポーネント所属のR_CGC_XXX()が呼ばれていますが)、どうも奇妙な気がするのです。

    R_BSP_Pins_Create()について ← R_Pins_Create()のタイプミスでしたとのことです
    japan.renesasrulz.com/cafe_rene/f/forum5/8093/r_bsp_pins_create/41990#41990

    aws_202107_101_e2v202204\application_code\renesas_code\main_task.c (トップのフォルダ名は当方のプロジェクトフォルダ)

    void main_task(void)
    {
        uint32_t bank_info;

        /* enable MCU pins */
        R_Pins_Create();


        /* flash initialization */
        R_FLASH_Open();
    //    R_FLASH_Control(FLASH_CMD_BANK_GET, &bank_info);
        R_SFD_Open();

        /* flash access semaphore creation */
        xSemaphoreFlashAccess = xSemaphoreCreateMutex();
        xSemaphoreGive(xSemaphoreFlashAccess);

    //    task_info.main_task_handle = xTaskGetCurrentTaskHandle();


        /* main loop */
        while(1)
        {
            vTaskDelay(10000);
        }
    }

     
    [関連リンク]

    スマート・コンフィグレータ ユーザーズマニュアル RX API リファレンス編
    R20UT4360JJ0106 Rev.1.06 Pages 533 2022.02.16
    www.renesas.com/jp/ja/document/mat/smart-configurator-users-manual-rx-api-reference
    31P



  • NoMaYさん

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

    ご指摘感謝です。ちょうどFreeRTOSの初期化シーケンスを洗いなおしていたところです。ハードウェアの初期化はスケジューラタスクの起動時に呼び出されるvApplicationDaemonTaskStartupHook()で行うべきと考えています。AWS社とも協議済です。少なくともフラッシュの初期化はvApplicationDaemonTaskStartupHook()に移動します。ピン設定の呼び出しも見直します。

    https://github.com/aws/amazon-freertos/blob/d16aa3b493203ea1b973cf6cf82a290be4b0a52f/vendors/renesas/boards/rx65n-rsk/aws_demos/application_code/main.c#L133

    あと、シェルティが作った最初のコードはNoMaYさんご提示の以下のような形にした記憶があるのですが、いつのまにかmain_task()をwhile(1)で呼び続ける感じなっていますね。このあたりもコード履歴を追うなどして確認して適切な形に直します。

    以上です

  • こんにちは。NoMaYです。

    RXスマートコンフィグレータから少し脱線しますが、e2 studioでGitHubからインポートしたamazon-freertos-202107.00-rx-1.0.1のRSK-RX65N 2MB aws_demosプロジェクトで、以下の画面コピーの赤枠のソースでRX65N以外のターゲット/フラッシュタイプのソースまでコンパイル/リンクしようとしているのは何かおかしいように思うのです。.projectファイルを見ると、わざわざリンクを作成してあるのですが、もしかしてドラッグ&ドロップ操作でガッと作ったまま不要なリンクを削除し忘れていた、といったことなどあったりとかしませんでしたでしょうか?





    [追記]

    e2 studioでGitHubからインポートしたamazon-freertos-202107.00-rx-1.0.1のRSK-RX65N 2MB aws_demosプロジェクト、というのは以下の画面コピーのもののことです。




     

  • こんにちは、すばるんです。

    不具合ではありませんが、タイマの設定について少し気になる点があった為投稿させて頂きます。

    MTUタイマとTPUタイマでそれぞれカウンタクロックの選択をしていたのですが、

    PCLK「A」を使用しているのか、PCLK「B」を使用しているのか分からない状態となっています。

    各タイマでどのクロックを使用しているか、データシートを見ればすぐ分かるお話ではありますが

    画面上でも確認できる状態となっていると良いのでは?と思いました。

    以下画面キャプチャです。(Rx230使用時)

    ・MTU (PCLKAを使用)

    ・TPU (PCLKBを使用)

    ・クロック設定

  • こんにちは。NoMaYです。

    今日、RX72Mの件でr_bsp_config.hを見る機会があって、以前のAmazon FreeRTOS Renesas RX OTA e2 studioプロジェクトのスレッドで疑問を感じていた件の理由が分かったような気がしました。最近のBSPモジュールでは、以下の定義が数値定数⇒文字列定数へ変更されているのですね。(それはそれとして、あと、ちょっと気になるのは、クロック系の定義が追加されているのだけれども、RXスマートコンフィグレータのバージョンが古いものであっても大丈夫だろうか?クロック系はガチのGUI設定画面になっているけれども、そのせいでもろもろハードコーディングされていそうで、バージョンが古いRXスマートコンフィグレータを使ったら適切に処理されずに初期値のままとなってしまうことは無いのだろうか、、、)

    r_bsp_config.h (RX72MのBSPモジュール向けのもの)

    *         : 30.11.2021 2.00     Added the following macro definitions.
    *                                - BSP_CFG_MAIN_CLOCK_OSCILLATE_ENABLE
    *                                - BSP_CFG_SUB_CLOCK_OSCILLATE_ENABLE
    *                                - BSP_CFG_HOCO_OSCILLATE_ENABLE
    *                                - BSP_CFG_LOCO_OSCILLATE_ENABLE
    *                                - BSP_CFG_IWDT_CLOCK_OSCILLATE_ENABLE
    *                                - BSP_CFG_CONFIGURATOR_VERSION
    *                                - BSP_CFG_CPLUSPLUS
    *                                - BSP_CFG_SERIAL_PROGRAMMER_CONECT_ENABLE
    *                               Changed initial value of the following macro definitions.
    *                                - BSP_CFG_MCU_PART_GROUP
    *                                - BSP_CFG_MCU_PART_SERIES

    途中省略

    /* Group name.
       Character(s) = Description
       2M           = RX72M Group
    */
    #define BSP_CFG_MCU_PART_GROUP          "RX72M" /* Generated value. Do not edit this manually */

    /* Series name.
       Character(s) = Description
       57           = RX700 Series
    */
    #define BSP_CFG_MCU_PART_SERIES         "RX700" /* Generated value. Do not edit this manually */

     
    壊れてしまったAmazon FreeRTOS Renesas RX OTA e2 studioプロジェクトを直してみるスレッド
    japan.renesasrulz.com/cafe_rene/f/forum21/8192/amazon-freertos-renesas-rx-ota-e2-studio/42321#42321

    一体、どこで、数値定数が文字列定数に置き換わる、なんてことが起きたのだろう、、、


  • こんにちは。NoMaYです。

    CGコンポーネントの生成ソースの割り込み関数関連のユーザ記述部の追加要望です。以下の2点を念頭においての要望です。

    (1) 割り込みエントリ関数の最初の部分と最後の部分でμITRON(NORTi等)対応のコードを入れたい (※)
    (2) 割り込み関数を全体的に書き換えたい(例えば通信系CGコンポーネントでのリングバッファ対応とかスレーブモード処理とか)

    ※ ただし、割り込みエントリ関数内でauto変数を使ってはいけない、といった制約との兼ね合いで単純にコードは入れられません

    要望する箇所は以下のように割り込みエントリ関数を間に挟んでその上と下です。(CC-RX/GNURX/ICCRXで共通です。)

    例) 赤文字の部分です。(以下はRSPIの例ですが他の生成ソースに関しても同様です。ただし、中身が丸ごとユーザ記述部となるような割り込みエントリ関数では、上と下に無くても構わないです。)

    /******************************************************************************
    * Function Name: r_Config_RSPI0_transmit_interrupt
    * Description  : This function is SPTI0 interrupt service routine
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        uint16_t frame_cnt;

        for (frame_cnt = 0U; frame_cnt < (_00_RSPI_FRAMES_1 + 1U); frame_cnt++)
        {
            if (g_rspi0_tx_count > 0U)
            {
                /* Write data for transmission */
                RSPI0.SPDR.WORD.H = (*(uint16_t*)gp_rspi0_tx_address);
                gp_rspi0_tx_address++;
                g_rspi0_tx_count--;
            }
            else
            {
                /* Disable transmit interrupt */
                RSPI0.SPCR.BIT.SPTIE = 0U;
                break;
            }
        }
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    /******************************************************************************
    * Function Name: r_Config_RSPI0_receive_interrupt
    * Description  : This function is SPRI0 interrupt service routine
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPRI0
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_receive_interrupt(void)
    {
        uint16_t frame_cnt;
        
        for (frame_cnt = 0U; frame_cnt < (_00_RSPI_FRAMES_1 + 1U); frame_cnt++)
        {
            if (g_rspi0_rx_length > g_rspi0_rx_count)
            {
                *(uint16_t *)gp_rspi0_rx_address = RSPI0.SPDR.WORD.H;
                gp_rspi0_rx_address++;
                g_rspi0_rx_count++;

                if (g_rspi0_rx_length == g_rspi0_rx_count)
                {
                    /* Disable receive interrupt */
                    RSPI0.SPCR.BIT.SPRIE = 0U;
                    break;
                }
            }
        }
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

     
    以下、運用例です。

    (1) 割り込みエントリ関数の最初の部分と最後の部分でμITRON(NORTi等)対応のコードを入れたい

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #pragma nolinline _r_Config_RSPI0_transmit_interrupt
    static void _r_Config_RSPI0_transmit_interrupt(void);

    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        NORTiの割り込み関数(入口用)を呼ぶ
        _r_Config_RSPI0_transmit_interrupt();
        NORTiの割り込み関数(出口用)を呼ぶ
    }

    #define r_Config_RSPI0_transmit_interrupt _r_Config_RSPI0_transmit_interrupt

    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        略
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPRI0
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #pragma nolinline _r_Config_RSPI0_receive_interrupt
    static void _r_Config_RSPI0_receive_interrupt(void);

    static void r_Config_RSPI0_receive_interrupt(void)
    {
        NORTiの割り込み関数(入口用)を呼ぶ
        _r_Config_RSPI0_receive_interrupt();
        NORTiの割り込み関数(出口用)を呼ぶ
    }

    #define r_Config_RSPI0_receive_interrupt _r_Config_RSPI0_receive_interrupt

    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_receive_interrupt(void)
    {
        略
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */

     
    (2) 割り込み関数を全体的に書き換えたい(例えば通信系CGコンポーネントでのリングバッファ対応とかスレーブモード処理とか)

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #if 0

    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        略
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #endif /* #if 0 */

    static void r_Config_RSPI0_transmit_interrupt(void)
    {
        自前の修正版(or全面変更版)割り込み処理
    }

    /* End user code. Do not edit comment generated here */

    #if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPRI0
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0),fint)
    #else
    #pragma interrupt r_Config_RSPI0_receive_interrupt(vect=VECT(RSPI0,SPRI0))
    #endif

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #if 0

    /* End user code. Do not edit comment generated here */

    static void r_Config_RSPI0_receive_interrupt(void)
    {
        略
    }

    /* Start user code for patching the interrupt function. Do not edit comment generated here */

    #endif /* #if 0 */

    static void r_Config_RSPI0_receive_interrupt(void)
    {
        自前の修正版(or全面変更版)割り込み処理
    }

    /* End user code. Do not edit comment generated here */

     
    [関連リンク]

    スマートコンフィグレータの自動生成をカスタマイズしたい
    japan.renesasrulz.com/cafe_rene/f/forum5/8248/thread

    スマート・コンフィグレータ SCIの割り込み
    japan.renesasrulz.com/cafe_rene/f/forum21/5875/sci

    シリアル受信の割り込み関数にユーザコード領域があれば...
    japan.renesasrulz.com/cafe_rene/f/forum18/6369/thread
     

  • こんにちは。NoMaYです。

    RXスマートコンフィグレータ自体の話では無いのですけれども、FITのT4_driverモジュール+GNURX+FreeRTOSの組み合わせでビルドエラー(リンクエラー)が発生するとの報告がありました。詳細は以下のスレッドに投稿されています。(当方の手元で再現しました。) なお、修正方法も投稿されています。

    また、T4のドキュメントに、GCC for Renesas RX 4.8.4.201803 以前のバージョンのみサポートする、以後のバージョンではGNURX側の変更による問題でビルドエラーが発生するので使用出来ない、という旨の記載がありますが、実際にはビルドエラーは発生しませんでした。これも詳細は以下のスレッドに投稿されています。最新ソースコードに対するドキュメント側の追従漏れの可能性が気になりました。

    FreeRTOSとr_t4_rxを使用した際のビルドエラーについて(RX72N)
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/8335/freertos-r_t4_rx-rx72n
     

  • こんにちは。NoMaYです。

    RXスマートコンフィグレータ自体の話では無いのですけれども、RX Driver PackageのV1.35が廃番になって代わりにV1.36が出ていますね。zipファイルを解凍した後の全てのzipファイルを解凍してファイル比較しないと差異が不明だったのですが、結果はr01an6515xx0135-rx-fitでFITModules/r_ether_rx_v1.23/r_config/r_ether_rx_config.hが欠落していたようでした。

  • こんにちは。NoMaYです。

    RXスマートコンフィグレータ自体の話では無いのですけれども、FITのDRW2Dモジュールのソースでvolatileおよび__evenaccessの漏れがあります。詳細は以下のスレッドに投稿されています。なお、以下は修正案についての記事です。

    RX65N/RX72N emWin+AppWizardでJapanese Language Displayが出来るか調べてみることにしました(Is it available?)
    japan.renesasrulz.com/cafe_rene/f/forum21/8320/rx65n-rx72n-emwin-appwizard-japanese-language-display-is-it-available/43148#43148
     

  • >また、T4のドキュメントに、GCC for Renesas RX 4.8.4.201803 以前のバージョンのみサポートする、以後のバージョンではGNURX側の変更による問題でビルドエラーが発生するので使用出来ない、という旨の記載がありますが、実際にはビルドエラーは発生しませんでした。

    この案内について説明します。
    ビルドエラーが発生するのはT4のライブラリ(r_t4_rx/make_lib/make_lib.zip の中にライブラリソースと作成用プロジェクトが入っています)を自前で作成する時です。ですので、ユーザ環境でT4ライブラリ(r_t4_rx/lib)をそのまま使用する分にはビルドエラーが発生しなかったものと推測します。
    アプリケーションノート作成時に上記の点が考慮漏れていたので、勘違いさせてしまいました。申し訳ありません。アプリケーションノートの修正を検討します。そういう訳ですので、「4.8.4.201803 以前のバージョンのみサポートする」は言い過ぎだったかもしれません。

    japan.renesasrulz.com/cafe_rene/f/002-2095199602/8335/freertos-r_t4_rx-rx72n
    で挙がっている2件のバグ(get_psw()とFreeRTOS_usr_cfg.h)については開発者側も認識済みです。
    いつまでに…というのはお約束できないのですが、修正を検討しています。