お世話になっております、ムヌルです。
RL78/G14とCS+を使用しています。
『R_UART0_Receive』関数について、気になった事がありました。
こちらの関数は初期の設定だと、
MD_STATUS R_UART0_Receive(uint8_t * const rx_buf, uint16_t rx_num){ MD_STATUS status = MD_OK; //正常終了ではなく、正常起動
if (rx_num < 1U) { status = MD_ARGERROR; } else { g_uart0_rx_count = 0U; g_uart0_rx_length = rx_num; gp_uart0_rx_address = rx_buf; }
return (status);}
という様になっていますが、ここでお聞きしたいことが3つあります。
①この関数の処理が行われるタイミングはいつか?
②この関数の戻り値(MD_OK等)は必ず使用しないとダメか?
又、この戻り値を無視しても問題はないのか。
(サンプルコードを見る限り、この戻り値を代入したり参照されたりしていない)
③この関数の戻り値を使用しない場合、void型に変更し、戻り値を使用しない
処理内容に変更してもよいか?(void型に変更し、returnを無くす程度)
戻り値というのは意味があって用意されています。
内容を理解した上で戻り値を使わないなら関数に先駆け(void)をつけるとC言語的かなと・・・ static char buf[BUF_SIZE](void)R_UART_Receive(buf, sizeof(buf_size));
中を読んでわかると思いますが受信時の書き込み先バッファポインタとそのサイズをセットして受信数が0ですよってことをしているだけです。戻り値でOKな状態もバッファサイズが0じゃないということだけの判定で、バッファのポインタが妥当?とかはチェックしてないので無視して構わないと思います。でもそれって実装の中身がわかるから無視してもいいって判断できますが、通常は戻り値がお願いしたい処理の結果として得られるので成功したのかを知る上で戻り値チェックをする癖があった方がいいと思います。これを設計した人の意図がよくわからないですが、「Receive」とついてて受信動作開始しないのは如何なもの?というのは私個人の意見なので声を小にして叫びます。実際にはこの関数の後にペリフェラルの動作開始をする仕組みを呼び出すか?内部変数が受信を要求している状態だと判断する部分があって、状態をポールして受信割り込みを有効化する仕組みとかあるのかな?
Shoji Yamamoto様
返信どうもありがとうございました。
「Receive」というのには語弊がある、というのは色々なサイトで良く見るような意見でした。
関数名に惑わされず、処理で何をしている関数なのか見極める必要があると感じています。
(私の場合は受信格納先設定関数というような認識で扱っております…)