シリアル受信の割り込み関数にユーザコード領域があれば...

コード生成はいつも活用させていただいてます。

早速ですが、コード生成でシリアル受信イベントは以下のように生成されます。


/***********************************************************************************************************************
* Function Name: r_uart1_interrupt_receive
* Description : This function is INTSR1 interrupt service routine.
* Arguments : None
* Return Value : None
***********************************************************************************************************************/
static void __near r_uart1_interrupt_receive(void)
{
 volatile uint8_t rx_data;
 volatile uint8_t err_type;

 err_type = (uint8_t)(SSR03 & 0x0007U);
 SIR03 = (uint16_t)err_type;
 rx_data = RXD1;

 if (g_uart1_rx_length > g_uart1_rx_count)
 {
 *gp_uart1_rx_address = rx_data;
 gp_uart1_rx_address++;
 g_uart1_rx_count++;
 }
}


 

さらにオプションを付けると、指定サイズ受信したら受信完了コールバックが呼ばれたり、エラーコールバックが呼ばれたりします。

ただ、受信完了コールバックは指定の受信サイズのデータ受信時に呼ばれる仕様となっており、特定のデータを受信したときに呼ばれる仕様とはなっていません。

通信対象によってはSuffix(接尾辞)Prefix(接頭辞)で判断することも多いかと思います。

上記のifブロックの下にユーザコード領域(以下例)があれば、受信完了フラグや受信開始フラグを容易に設定できるような気がします。


/* Start user code. Do not edit comment generated here */
if(rx_data == 0x0A) {
     // 受信完了処理
}
/* End user code. Do not edit comment generated here */

 

 

いつもこの受信イベント関数を改造して、特定のコード受信時に受信完了とするようにしています。

ただ、再生成したら改造コードは消えてしまうので、別に定義しておく必要があります。

 

割り込み処理ですのであまり重いコードを書くと不具合になるかもしれませんが、受信コードチェックくらいなら問題はないと思います。
実際今のところ問題は出ていません。

 

他の方は受信完了コールバックをどのように実装されていますか?
ご意見いただければと思います。

もし問題がなければ、コード生成で生成されるコードの受信イベントにユーザ定義領域を追加していただければと思います。

 

 

 

 

Parents
  • tiさん、こんにちは。NoMaYと申します。

    RL78コード生成機能では小技がありますよ。(もしかすると受信完了コールバック関数を生成するようにしないと生成されないのかも知れませんが(いつも私は生成させていたので))生成されたコードのr_uartXX_callback_softwareoverrun()関数を利用するのが良いと思います。

    具体的な利用例として以下のサンプルプログラムがあります。(リングバッファの実装に使用した例ですが。)

    RL78コード生成へのリングバッファ追加 - チョコさん
    japan.renesasrulz.com/cafe_rene/m/sample_program/306

    RL78 FreeRTOS APIを特別なおまじない記述無しで割り込みルーチンから呼び出せるようにしてみた(CC-RL/GNURL78) - 上記を参考に私がFreeRTOS対応させてみたもの
    japan.renesasrulz.com/cafe_rene/f/forum21/5845/rl78-freertos-api-cc-rl-gnurl78/34947#34947
    rl78g14fpb_freertos_sampleprog3_ccrl_c_csplus_20200503.zip

    また、RL78コード生成機能の話題ではありませんが、関連した話題として以下のRXスマートコンフィグレータのスレッドがあります。

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

    コード生成されたコードの以下のr_uartXX_callback_softwareoverrun()関数を利用する(上記のzipファイルより抜き出し)

    static void __near r_uart3_interrupt_receive(void)
    {
        volatile uint8_t rx_data;
        volatile uint8_t err_type;
        
        err_type = (uint8_t)(SSR13 & 0x0007U);
        SIR13 = (uint16_t)err_type;

        if (err_type != 0U)
        {
            r_uart3_callback_error(err_type);
        }
        
        rx_data = RXD3;

        if (g_uart3_rx_length > g_uart3_rx_count)
        {
            *gp_uart3_rx_address = rx_data; ←↓ このブロックの此処から下は使わないと割り切る
            gp_uart3_rx_address++;
            g_uart3_rx_count++;

            if (g_uart3_rx_length == g_uart3_rx_count)
            {
                r_uart3_callback_receiveend();
            }
        }
        else
        {
            r_uart3_callback_softwareoverrun(rx_data);
        }
    }
    static void r_uart3_callback_softwareoverrun(uint16_t rx_data)
    {
        /* Start user code. Do not edit comment generated here */

        if (0U == g_uart3_rx_error_type && 0U == g_uart3_rx_abort_type)
        {
            u_uart3_callback_receivedata( rx_data );

            if (0U != g_uart3_rx_status)
            {
                r_uart3_callback_error( SCI_EVT_RXBUF_OVFL );
            }
            else if (g_uart3_rx_length == g_uart3_rx_dtno)
            {
                r_uart3_callback_receiveend();
            }
        }

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

     

Reply
  • tiさん、こんにちは。NoMaYと申します。

    RL78コード生成機能では小技がありますよ。(もしかすると受信完了コールバック関数を生成するようにしないと生成されないのかも知れませんが(いつも私は生成させていたので))生成されたコードのr_uartXX_callback_softwareoverrun()関数を利用するのが良いと思います。

    具体的な利用例として以下のサンプルプログラムがあります。(リングバッファの実装に使用した例ですが。)

    RL78コード生成へのリングバッファ追加 - チョコさん
    japan.renesasrulz.com/cafe_rene/m/sample_program/306

    RL78 FreeRTOS APIを特別なおまじない記述無しで割り込みルーチンから呼び出せるようにしてみた(CC-RL/GNURL78) - 上記を参考に私がFreeRTOS対応させてみたもの
    japan.renesasrulz.com/cafe_rene/f/forum21/5845/rl78-freertos-api-cc-rl-gnurl78/34947#34947
    rl78g14fpb_freertos_sampleprog3_ccrl_c_csplus_20200503.zip

    また、RL78コード生成機能の話題ではありませんが、関連した話題として以下のRXスマートコンフィグレータのスレッドがあります。

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

    コード生成されたコードの以下のr_uartXX_callback_softwareoverrun()関数を利用する(上記のzipファイルより抜き出し)

    static void __near r_uart3_interrupt_receive(void)
    {
        volatile uint8_t rx_data;
        volatile uint8_t err_type;
        
        err_type = (uint8_t)(SSR13 & 0x0007U);
        SIR13 = (uint16_t)err_type;

        if (err_type != 0U)
        {
            r_uart3_callback_error(err_type);
        }
        
        rx_data = RXD3;

        if (g_uart3_rx_length > g_uart3_rx_count)
        {
            *gp_uart3_rx_address = rx_data; ←↓ このブロックの此処から下は使わないと割り切る
            gp_uart3_rx_address++;
            g_uart3_rx_count++;

            if (g_uart3_rx_length == g_uart3_rx_count)
            {
                r_uart3_callback_receiveend();
            }
        }
        else
        {
            r_uart3_callback_softwareoverrun(rx_data);
        }
    }
    static void r_uart3_callback_softwareoverrun(uint16_t rx_data)
    {
        /* Start user code. Do not edit comment generated here */

        if (0U == g_uart3_rx_error_type && 0U == g_uart3_rx_abort_type)
        {
            u_uart3_callback_receivedata( rx_data );

            if (0U != g_uart3_rx_status)
            {
                r_uart3_callback_error( SCI_EVT_RXBUF_OVFL );
            }
            else if (g_uart3_rx_length == g_uart3_rx_dtno)
            {
                r_uart3_callback_receiveend();
            }
        }

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

     

Children
  • NoMaYさま

    返信ありがとうございます。
    オーバーランを使うそんな方法があったとは知りませんでした。
    ちょっと参考にしてみます(まだ全部読めていません)
    r_uart3_callback_receiveend();
    ではなく
    r_uart3_callback_softwareoverrun()
    を使うとは思いつきませんでした。

    4年前にリンク先の記事に気づいていればよかったですね。
    ちらっと読んだのですが、PDFの本文中に
    「本当は割り込み処理本体部に記述するのが望ましいのですが,そうするとコード生成を行うと消されてしまいます。余分なコードが残ります」
    という一文があり、作成者としては割り込み関数の中にあってもいいのにねという含みを感じました。