スマート・コンフィグレータ SCIの割り込み

ルネサス 鈴木様 ならびに回答いただける方々 お願いいたします。

 

初めて投稿いたします。

ルネサススターターキットfor Rx231 を使用して機能を試しています。

CS+でコード生成(設計ツール)を使用して来たのですが、この度 スマート・コンフィグレータをインストールして使用しはじめました。

SCIの割り込みの部分ですが、一例として 受信 割り込みの自動生成コードをコピペすると

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

#if FAST_INTERRUPT_VECTOR == VECT_SCI0_RXI0
#pragma interrupt r_Config_SCI0_receive_interrupt(vect=VECT(SCI0,RXI0),fint)
#else
#pragma interrupt r_Config_SCI0_receive_interrupt(vect=VECT(SCI0,RXI0))
#endif
static void r_Config_SCI0_receive_interrupt(void)
{
    if (g_sci0_rx_length > g_sci0_rx_count)
    {
        *gp_sci0_rx_address = SCI0.RDR;
        gp_sci0_rx_address++;
        g_sci0_rx_count++;
    }

    if (g_sci0_rx_length <= g_sci0_rx_count)
    {
        /* All data received */
        SCI0.SCR.BIT.RIE = 0U;
        SCI0.SCR.BIT.RE = 0U;
        r_Config_SCI0_callback_receiveend();
    }
}

のようになっています。

①この生成コード(送信の部分も)の中は、ユーザーが追記できる部分がありませんが、

つまり、

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

のパートが含まれていませんが、割込みがおこった際にフラグを立てたりといった追加、独自の処理をしたい場合、どのようにコードを書くのが良いのでしょうか?

ユーザーがどのようにすることを想定しているのでしょうか?

 

②スマート・コンフィグレータの方には、それまで作成されなかった、

void R_Config_SCI0_Create_UserInit(void);

という関数が新たに加わっていますが、これはどういう点から追加されたのでしょうか?

こちらの関数は、中が空で、

void R_Config_SCI0_Create_UserInit(void)
{
    /* Start user code for user init. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
}

のようになっているのが判りますが、①の部分を解決するためでしょうか?

追加された目的を知りたいので、回答お願いいたします。

Parents
  • こんにちは。NoMaYです。#先日の投稿の自己フォローです。

    この際ですので、チョコさんが以前に投稿されたサンプルプログラムの『RL78コード生成へのリングバッファ追加』をRXスマートコンフィグレータでやって投稿しようかと思い、ゴソゴソやり始めてみて気付いたのですが、RL78コード生成機能ではフレームワークの枠内でもリングバッファを実装可能だった、のですね。ところが、RXスマートコンフィグレータのコード生成コンポーネントではフレームワークの枠内では実装出来ない、のですね。ようやくそのことが分かって来ました、、、

    RL78コード生成機能

    ・巧みにr_uartXX_callback_softwareoverrun()を使うことでリングバッファを実装可能である

    RXマートコンフィグレータのコード生成コンポーネント

    ・上記相当の例えばr_Config_SCIXX_callback_softwareoverrun()といったものが無くリングバッファを実装出来ない

    RXマートコンフィグレータでの対処案

    ・そのSCIチャンネルに関しては(参考としてソース生成させるのみで)全てを自前で実装する(ビーコン菅原さん案)
    ・Config_SCIXX_user.cをビルドから除外して代わりとなる自前のソースをプロジェクトに追加する(鈴木さん案)
    ・先日の自分の投稿の「SCI設定で受信をDTCで行うという設定を選択する」という裏技を使用する

    もしくは

    ・SCIに関してはコード生成コンポーネントを生成させるではなくFITモジュールを生成させる

    ちなみに、以前のチョコさんの投稿では、RL78コード生成機能で生成されたソースの割り込み処理に以下のコードを追加し、リングバッファの割り込み処理を実装されていました。(赤文字箇所が追加部分です。青文字箇所はr_uartXX_callback_softwareoverrun()関連の部分です。)

    /******************************************************************************
    * Function Name: r_uart0_interrupt_receive
    * Description  : This function is INTSR0 interrupt service routine.
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    static void __near r_uart0_interrupt_receive(void)
    {
        volatile uint8_t rx_data;
        volatile uint8_t err_type;
        
        err_type = (uint8_t)(SSR01 & 0x0007U);
        SIR01 = (uint16_t)err_type;

        if (err_type != 0U)
        {
            r_uart0_callback_error(err_type);
        }
        
        rx_data = RXD0;

        if (g_uart0_rx_length > g_uart0_rx_count)
        {
            *gp_uart0_rx_address = rx_data;
            gp_uart0_rx_address++;
            g_uart0_rx_count++;

            if (g_uart0_rx_length == g_uart0_rx_count)
            {
                r_uart0_callback_receiveend();
            }
        }
        else
        {
            r_uart0_callback_softwareoverrun(rx_data);
        }
    }
    /******************************************************************************
    * Function Name: r_uart0_callback_softwareoverrun
    * Description  : This function is a callback function when UART0 receives an overflow data.
    * Arguments    : rx_data -
    *                    receive data
    * Return Value : None
    ******************************************************************************/
    static void r_uart0_callback_softwareoverrun(uint16_t rx_data)
    {
        /* Start user code. Do not edit comment generated here */
        /* 受信用リングバッファ制御 */

        uint8_t  setptr;

        if ( g_rx_dtno < 16 )
        {                           /* バッファに空きあり                       */
            setptr = ((g_rx_rdpt + g_rx_dtno) & 0x0F);  /* 書き込みポインタ     */
            g_rx_buff[setptr] = rx_data;    /* 受信データをバッファに格納       */
            g_rx_dtno++;
        }
        else
        {                           /* バッファがフル時の処理                   */
            g_rx_status = 0x80;             /* オーバフロー・フラグをセット     */
        }
        /* End user code. Do not edit comment generated here */
    }

    それから、鈴木さん案(リプライにあったFAQのこと)ですが、具体的には、一例として、以下の画面コピーのプロジェクトのようにすれば良い、ということだと思います。

    CS+の場合


    e2 studioの場合

Reply
  • こんにちは。NoMaYです。#先日の投稿の自己フォローです。

    この際ですので、チョコさんが以前に投稿されたサンプルプログラムの『RL78コード生成へのリングバッファ追加』をRXスマートコンフィグレータでやって投稿しようかと思い、ゴソゴソやり始めてみて気付いたのですが、RL78コード生成機能ではフレームワークの枠内でもリングバッファを実装可能だった、のですね。ところが、RXスマートコンフィグレータのコード生成コンポーネントではフレームワークの枠内では実装出来ない、のですね。ようやくそのことが分かって来ました、、、

    RL78コード生成機能

    ・巧みにr_uartXX_callback_softwareoverrun()を使うことでリングバッファを実装可能である

    RXマートコンフィグレータのコード生成コンポーネント

    ・上記相当の例えばr_Config_SCIXX_callback_softwareoverrun()といったものが無くリングバッファを実装出来ない

    RXマートコンフィグレータでの対処案

    ・そのSCIチャンネルに関しては(参考としてソース生成させるのみで)全てを自前で実装する(ビーコン菅原さん案)
    ・Config_SCIXX_user.cをビルドから除外して代わりとなる自前のソースをプロジェクトに追加する(鈴木さん案)
    ・先日の自分の投稿の「SCI設定で受信をDTCで行うという設定を選択する」という裏技を使用する

    もしくは

    ・SCIに関してはコード生成コンポーネントを生成させるではなくFITモジュールを生成させる

    ちなみに、以前のチョコさんの投稿では、RL78コード生成機能で生成されたソースの割り込み処理に以下のコードを追加し、リングバッファの割り込み処理を実装されていました。(赤文字箇所が追加部分です。青文字箇所はr_uartXX_callback_softwareoverrun()関連の部分です。)

    /******************************************************************************
    * Function Name: r_uart0_interrupt_receive
    * Description  : This function is INTSR0 interrupt service routine.
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    static void __near r_uart0_interrupt_receive(void)
    {
        volatile uint8_t rx_data;
        volatile uint8_t err_type;
        
        err_type = (uint8_t)(SSR01 & 0x0007U);
        SIR01 = (uint16_t)err_type;

        if (err_type != 0U)
        {
            r_uart0_callback_error(err_type);
        }
        
        rx_data = RXD0;

        if (g_uart0_rx_length > g_uart0_rx_count)
        {
            *gp_uart0_rx_address = rx_data;
            gp_uart0_rx_address++;
            g_uart0_rx_count++;

            if (g_uart0_rx_length == g_uart0_rx_count)
            {
                r_uart0_callback_receiveend();
            }
        }
        else
        {
            r_uart0_callback_softwareoverrun(rx_data);
        }
    }
    /******************************************************************************
    * Function Name: r_uart0_callback_softwareoverrun
    * Description  : This function is a callback function when UART0 receives an overflow data.
    * Arguments    : rx_data -
    *                    receive data
    * Return Value : None
    ******************************************************************************/
    static void r_uart0_callback_softwareoverrun(uint16_t rx_data)
    {
        /* Start user code. Do not edit comment generated here */
        /* 受信用リングバッファ制御 */

        uint8_t  setptr;

        if ( g_rx_dtno < 16 )
        {                           /* バッファに空きあり                       */
            setptr = ((g_rx_rdpt + g_rx_dtno) & 0x0F);  /* 書き込みポインタ     */
            g_rx_buff[setptr] = rx_data;    /* 受信データをバッファに格納       */
            g_rx_dtno++;
        }
        else
        {                           /* バッファがフル時の処理                   */
            g_rx_status = 0x80;             /* オーバフロー・フラグをセット     */
        }
        /* End user code. Do not edit comment generated here */
    }

    それから、鈴木さん案(リプライにあったFAQのこと)ですが、具体的には、一例として、以下の画面コピーのプロジェクトのようにすれば良い、ということだと思います。

    CS+の場合


    e2 studioの場合

Children
  • NoMaY様

    色々なパターンをまとめていただき、ありがとうございます。
    RL78とRXでも、コード生成で実装可否の違いがあることまで記載いただき、助かります。m(__)m