# OS_SpinWait*

## 構文

  `#include <nitro/os.h>`
  `void OS_SpinWait( u32 cycles );
  void OS_SpinWaitCpuCycles( u32 cycles );
  void OS_SpinWaitSysCycles( u32 cycles );`

## 引数

cycles | 待機するサイクル数 。 `OS_SpinWait()` の場合、ベースサイクルの2逓倍 を基準とします。 `OS_SpinWaitCpuCycles()` の場合、CPUサイクル を基準とします。 `OS_SpinWaitSysCycles()` の場合、ベースサイクル を基準とします。

## 返り値

なし。

## 説明

CPU を最低でも cycles で指定されたサイクル数、空ループさせます。

これは単純な空のループ処理を行なうだけの関数ですので、割り込み許可状態によるループ中に発生する割り込みなどによって、関数からの復帰予定時刻が大幅に遅れる場合も考えられますのでご注意ください。

関数からの復帰は、関数呼び出しなどのオーバーヘッドにより指定したサイクル数より若干遅れます。

`OS_SpinWaitCpuCycles()` はCPUサイクルを基準とします。

`OS_SpinWaitSysCycles()` はベースサイクルを基準とします。NITRO/TWLモードや、CPU周波数の切り替えに依存しません。

`OS_SpinWait()` はNITROとの互換性を考慮して、CPUの動作周波数に関わらず一定の値を基準とします。ARM9の場合、ベースサイクルの2逓倍を基準とします。ARM7の場合、ベースサイクルを基準とします。NITRO では、`OS_SpinWait()` を「CPUサイクルを基準とした空ループ」としていました。しかし、TWLではCPU周波数を切り替えることが出来るため、NITROのソースを利用したときの利便性を考えてこのようにしています。

サイクル数 cycles が基準とする周波数は以下のようになります。

> `OS_SpinWait()`

> プラットフォーム | cyclesの基準となる周波数
> --- | ---
> ARM9 | ARM7
> NITRO | 67.03MHz | 33.51MHz
> TWL

> `OS_SpinWaitCpuCycles()`

> プラットフォーム | cyclesの基準となる周波数
> --- | ---
> ARM9 | ARM7
> NITRO | 67.03MHz | 33.51MHz
> TWL | 67.03MHz(等速動作時) 134.06MHz(倍速動作時)

> `OS_SpinWaitSysCycles()`

> プラットフォーム | cyclesの基準となる周波数
> --- | ---
> ARM9 | ARM7
> NITRO | 33.51MHz
> TWL

## 参照

`SVC_WaitByLoop()`

## 履歴

2007/09/27 `OS_SpinWaitCpuCycles`, `OS_SpinWaitSysCycles()` について記述
2004/02/27 初版