CS+の割り込み関数『static void __near r_it_interrupt(void)』の疑問について

お世話になっております、ムヌルです。

ふとした疑問があったので、質問させていただきました。

結論から言うと、

①割り込み関数に戻り値の設定は可能でしょうか(関数をuint8_t型かint型にしたい)。

②割り込み関数は関数名から自作していく事は可能でしょうか。

という二点についておききしたいです。

私はいま、CS+のr_cg_it_user.cファイルのstatic void __near r_it_interrupt(void)に、

戻り値を設定したいと考えています。

具体的には状態遷移を用いて、return値をメインで使用したく、この関数を

『static void __near』 r_it_interrupt(void)

『uint8_t』 void __near r_it_interrupt(void)

に変更したいと考えていますが、これをするとエラーで『不正な#pragmaを指定しました』

とエラーがでてしまいます。

#pragmaの仕様等についても理解できていないので、ここを調べろというサイトや資料でも構いません。よろしければお力添えいただければ幸いです。

  • 割り込み関数と通常の関数では関数の戻りで生成される機械語が違います。そして何より割り込み関数はイベント発生時に割り込み可能な状態で呼び出されますので、戻り値を受け取る方法はありません。割り込みがあったことを大域変数に記録して、その時の終了時の答えを同じく大域変数で受け取るのは可能です。

    質問の意図が割り込み以外でも使う関数で、通常の関数呼び出しでは戻り値を期待しているなら、通常の関数を作成して、割り込みハンドラの中でそれを呼び出すようにしましょう。

  • #pragmaはコンパイラの独自仕様を実装するためにあるものなので、使っているコンパイラのマニュアルを見てください。違うコンパイラの記事を見ても参考になりません。
    (参考)CS+のオンラインヘルプ - CC-RXの拡張言語仕様:
    https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/latest/CS+.chm/Compiler-CCRX.chm/Output/ccrx04c0203y.html

    ベクタテーブルに書かれたアドレスをマイコンが直接呼び出すのが割り込みで、呼び出し元の関数はありません。引数も戻り値もないのはそれが理由です。
    (参考) 割込みの仕組み
    https://www.lapis-tech.com/jp/common/miconlp/tips/3-24-%e5%89%b2%e8%be%bc%e3%81%bf%e3%81%a8%e3%81%af3/

    割り込み関数内の処理内容を他でも使いたいなら別に関数を作るべきです。
    割り込み関数を新たに作りたいなら同じデバイスのサンプルプロジェクトを参考にしてください。ベクタテーブルの書き方もデバイスファミリやデバイスの世代で違うので(割り込みの仕様もデバイスの仕様に依存するので)御注意ください。

  • Shoji Yamamoto様

    返信ありがとうございます。

    割り込み関数の仕様からして戻り値が受け取れない(方法がない)という事で解釈しました。

    どうもありがとうございました。

  • ほや様

    アドバイスありがとうございます。無事解決いたしました。

    ほや様の説明とサイトの説明で点と点がつながって腑に落ちました。

    どうもありがとうございました。