ArduinoR4minima を使用しています。FSPタイマーで割込みし、そのコールバック関数内で、ハードウェアシリアル(Serial1.write)での通信を実施しようとしたところ、できませんでした。前記のハードウェアシリアルの代わりに、USBSerial(Serial.write)のコードを試したところ、通信できていることから、FSPタイマーにおける割込み処理において、ハードウェアシリアルにアクセスできない原因があるのかなと想像しています。
定周期通信を実施したいため、FSPタイマーのコールバック関数内で、上記ハードウェアシリアルによる通信を行いたいので、対策方法をご教示願います。
ArduinoR4はたまに使いますが、普段はe2studio+E2Lite(C言語)で使ってます。ちょっと気になったので、Arduino IDEで試してみました。
Serial.writeだと、タイマのコールバック関数内でも動きました。Serial1.writeだと、文字が出力されないだけかと思っていたのですが、プログラム自体が止まってしまって、ボードが反応しなくなりました。(もちろん、オリジナルのファームを書き込むと復活します。)
上記書き込みを読んだ時から、割り込み優先度の問題かな?と思っていました。ソースで割り込み優先度を確認すると、USBもSCIも同じ優先度でした。予想が外れたと思いましたが、とりあえず優先度をいじってみると、タイマのコールバック関数内でも、Serial1.writeが動きました。
C:\Users\[UserName]\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.2.2\cores\arduino\IRQManager.cpp
(1.2.2はバージョンなのでichitaka00さまの環境では違うかもしれません)
14行目
#define UART_SCI_PRIORITY 12
上記ソースに拠ると、SCI(UART)の割り込み優先度が12なので、
上記の様に、タイマのオーバフロー割り込み(使っているのがオーバフロー割り込みでない場合は、割り込み種別に応じた関数)の優先度を12より大きくしてください(=優先度を下げてください)。(RA4M1の割り込みは、0~15で、0が最高優先度)
早速のアドバイスありがとうございました(そして、しばらく、確認できない状況に陥ってしまっていたため、返信が遅くなってしまって大変失礼しました。)上記の通り、設定することでfsptimer関数内でserial1の呼び出しに成功しました。ありがとうございます。もし以下についても御知見ありましたら、うかがえると幸いです。fsptimerのループが早いせいか、serial通信の通信周期が安定しない or 送信ミスが発生しています。(前述の通り、serial通信の処理中にfsptimerの次のループ処理が入ることでserial通信自体が不安定になってしまっているのかな??と考えて、今freeRTOSでserail通信をfsptimerの外に出すことをトライしようと考えています。)
>serial通信の処理中にfsptimerの次のループ処理が入ることで
↑じゃないかと思います。
割り込み関数内では、フラグの処理のみ行い、メインループ内でシリアルの出力を行うというのが良いと思います。