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にもおそらく共通する話であろうかと思う。

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

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

Children
No Data