avr-libc  2.0.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

Example Projects

マクロ | 関数
<util/delay.h>: 便利な busy-wait 遅延ループ

マクロ

#define F_CPU   1000000UL
 

関数

void _delay_ms (double __ms)
 
void _delay_us (double __us)
 

説明詳細

#define F_CPU 1000000UL // 1 MHz
//#define F_CPU 14.7456E6
#include <util/delay.h>
注意
別の方法として、Makefileからコンパイラーへ、F_CPUマクロを引き継ぐこともできます。その場合は、#define文は必要ありません。

このヘッダファイルの関数は、<util/delay_basic.h>で提供される基本的なbusy-wait関数のラッパーです。何サイクル待機するかではなく、実際の時間値を指定できる便利な関数になっています。アイディアの背景として、F_CPUマクロで渡されるCPU周波数から必要な遅延サイクル数を計算します。浮動小数点表記は、コンパイル時に定数式としてコンパイラの最適化で除去されます。

注意
これらの関数を意図した通り動かすには、コンパイラの最適化を必ず有効にし、遅延時間は、コンパイル時には、必ず既知の定数でなけれなりません。これらの要件が満たされない場合、生じる遅延は遙かに長く(基本的に予測できなく)なり、それ以外に浮動小数点計算を用いないアプリケーションでは、アプリケーションに浮動小数点ライブラリルーチンをリンクしたような深刻なコードの膨張を経験することになります。

関数では、F_CPUマクロのCPUクロック周波数(Hz)を用いることで、マイクロ秒とミリ秒の遅延を直接指定できるようになります。

マクロ定義説明

#define F_CPU   1000000UL

Hz表記のCPU周波数

F_CPUマクロは、遅延マクロの計算で使用されるCPU周波数を指定します。このマクロは通常環境(たとえばプロジェクトヘッダーファイルやMakefileから)提供されます。ユーザー定義が見つからないときは、初期値として1MHzが設定されます。

遅延関数に関しては、CPU周波数を浮動小数点定数として指定できます(たとえば 3.6864MHzを 3.6864E6)。 しかし、<util/setbaud.h> マクロは、整数値である必要があります。

関数説明

void _delay_ms ( double  __ms)

_delay_loop_2()を使用して、__msミリ秒の遅延を発生します。

F_CPUマクロは、CPUクロック周波数(Hz単位)の定数を定義します。

最大遅延時間は、262.14ms / F_CPU(MHz)です。

ユーザが最大遅延時間を超える遅延を要求すると、_delay_ms()は、低分解能な機能を提供します。このモードでは、_delay_ms()は、1/10ミリ秒の分解能で動作し、最大6.5535秒の遅延を提供します(CPUの周波数に依存しません)。ユーザには、分解能の低下は通知されません。

avr-gccツールチェーンが、__builtin_avr_delay_cycles()をサポートしている場合、可能な最大遅延時間は4294967.295 ms / F_CPU(MHz)です。最大遅延時間より大きい場合は、オーバーフローし遅延しません、つまり0ミリ秒になります。

__msをクロックサイクルに変換すると、常に整数になるとは限りません。標準で、クロックサイクルは整数に切り上げられます。これにより、ユーザは最小__msミリ秒の遅延を得られます。

また、このヘッダファイルをインクルードされる前に、__DELAY_ROUND_DOWN____DELAY_ROUND_CLOSEST__を定義することで、それぞれのアルゴリズムで整数の切り捨てや丸めを指定できます。

注意

__builtin_avr_delay_cycles()に基づく_delay_ms() の実装は、古い実装と後方互換性がありません。以前のバージョンと後方互換性を確保するためには、このヘッダファイルをインクルードする前に、"__DELAY_BACKWARD_COMPATIBLE__"マクロを定義する必要があります。また、コードがフリースタンディング環境(GCCオプション -ffreestanding)でコンパイルされるときは、後方互換アルゴリズムが選択されます。これは、丸めに必要な数学関数がコンパイラで利用できないためです。

void _delay_us ( double  __us)

_delay_loop_1()を使用して、__usマイクロ秒の遅延を発生します。

F_CPUマクロは、CPUクロック周波数(Hz単位)の定数を定義します。

最大遅延時間は、768 us / F_CPU(MHz)です。

ユーザが最大遅延時間を超える遅延を要求すると、_delay_us() は自動的に_delay_ms()を呼び出します。この場合でもユーザには通知されません。

avr-gccツールチェーンが、__builtin_avr_delay_cycles()をサポートしている場合、最大遅延時間は 4294967.295 us/ F_CPU(MHz)です。最大遅延時間より大きい場合は、オーバーフローし遅延しません、つまり0マイクロ秒になります。

__usをクロックサイクルに変換すると、標準で、クロックサイクルは整数に切り上げられます。これにより、ユーザは最小__usマイクロ秒の遅延を得られます。

また、このヘッダファイルをインクルードされる前に、__DELAY_ROUND_DOWN____DELAY_ROUND_CLOSEST__を定義することで、それぞれのアルゴリズムで整数の切り捨てや丸めを指定できます。

注意

__builtin_avr_delay_cycles()に基づく_delay_ms() の実装は、古い実装と後方互換性がありません。以前のバージョンと後方互換性を確保するためには、このヘッダファイルをインクルードする前に、"__DELAY_BACKWARD_COMPATIBLE__"マクロを定義する必要があります。また、コードがフリースタンディング環境(GCCオプション -ffreestanding)でコンパイルされるときは、後方互換アルゴリズムが選択されます。これは、丸めに必要な数学関数がコンパイラで利用できないためです。