Renesas Synergy™

FAQ 1011870 : ソフトウェアタイマとコンパイラの最適化(CC-RH/CC-RX/CC-RL)

Q : 質問

ソフトウェアタイマ方式として、指定した回数分ループして、ある時間を待つプログラムを作成していますが、 指定した回数分のループ処理のコードにならず、期待した時間になりません。 何か考えられる原因はありますか?

(例)

#define WAIT_COUNT 10000
int i;
for(i=0; i < WAIT_COUNT; i++){}

 


A : 回答:

最適化によってループ処理が削除される可能性があります。

for文中に組み込み関数のnop関数(注)を呼び出す、またはループ変数iをvolatile修飾することで、ループ処理の削除を抑止できます。

ただし、コンパイラのバージョンやコンパイルオプションによって出力コードが変更されるため、同じCプログラムでも処理時間が異なる可能性があります。
そのため、コンパイラのバージョンやコンパイルオプションを変更した場合には、期待した処理時間になるか確認する必要があります。

指定した時間を待つプログラムを、Cプログラムではなくアセンブリプログラムで記述していただくことで、上記の現象には該当しなくなります。

なお、途中に割り込み処理が入った場合には、その時間も含まれてしまいますので、これらを考慮してループ回数を決め、待ち時間を調節してください。

待ち時間の精度が必要な場合には、プログラムで時間を待つソフトウェアタイマ方式ではなく、マイコンの持つタイマ機能で時間を測定することをお勧めいたします。

(注)
nop関数は、nop(CC-RX)、__nop(CC-RH、CC-RL)と
コンパイラにより違いがありますので、詳細は、各コンパイラのユーザーズマニュアルをご参照ください。

・RH850ファミリ用Cコンパイラパッケージ(CC-RH)
 「4.2.4.7 組み込み関数」
・RXファミリ用C/C++コンパイラパッケージ(CC-RX)
 「4.2.6 組み込み関数」
・RL78ファミリ用Cコンパイラパッケージ(CC-RL)
 「4.2.5 組み込み関数」

 

適用製品

e² studio
CS+ (旧 CubeSuite+)
RL78ファミリ用Cコンパイラパッケージ
RH850ファミリ用Cコンパイラパッケージ
RXファミリ用C/C++コンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください