avr-libc
2.0.0
Standard C library for AVR-GCC
|
AVR Libc Home Page |
AVR Libc Development Pages |
||||
Main Page |
User Manual |
Library Reference |
FAQ |
Example Projects |
マクロ | |
#define | F_CPU 1000000UL |
関数 | |
void | _delay_ms (double __ms) |
void | _delay_us (double __us) |
#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
)でコンパイルされるときは、後方互換アルゴリズムが選択されます。これは、丸めに必要な数学関数がコンパイラで利用できないためです。