# SVC_CpuClear*

## 構文

      #include <nitro/os/common/systemCall.h>

      #define SVC_CpuClear( data, destp, size, bit );
      #define SVC_CpuClearArray( data, destp, bit );
      #define SVC_CpuClearFast( data, destp, size );
      #define SVC_CpuClearArrayFast( data, destp );

      (これらはマクロです)

## 引数

data | クリアデータ
destp | デスティネーションアドレス
size | 転送バイト数
bit | 転送ビット幅(16 または 32)

## 返り値

なし。

## 説明

システムコールを用いてCPUでメモリクリアを行います。
`MI_CpuClear*()` は0でメモリを埋める関数ですが、`SVC_CpuClear*()` は指定の値でメモリを埋める関数です。

`SVC_CpuClear*()` はマクロなので、destp はポインタであれば型は制限されません。size は u32 です。bit は 16 か 32 の即値のみが指定できます。data はクリアデータ(メモリを埋めるデータ)で、bit が 16 の場合 u16 の値を、bit が 32の場合 u32 の値を指定してください。

`MI_CpuClear*()` や `MI_CpuFill*()` との動作上の違いは、`SVC_CpuClear*()` はシステムROM上で動作するため、キャッシュやTCMで動作する場合の半分の周波数で動作するという点です。しかしキャッシュが有効である場合はループ部分での差はないのでSVC関数の呼び出しのオーバーヘッドの発生が差異となってきます。また引数の指定の仕方が異なり、メモリを埋める値の指定の仕方も違うのは前述の通りです。どちらの関数でも記述が出来る場合、特に理由がなければ `SVC_CpuClear*()` より `MI_CpuClear*()` や `MI_CpuFill*()` を用いるのがよいでしょう。

`SVC_Clear()` はdata で示されるデータを destp で示されるアドレス以下 size バイトに書き込みます。 destp は 転送ビットが16の場合は2バイト境界に、32の場合は4バイト境界に合わせる必要があります。

`SVC_CpuClearArray()` は、sizeof( destp ) を転送サイズとする `SVC_CpuClear()`です。つまり `SVC_CpuClear( data, destp, sizeof(destp), bit )` と同じです。

`SVC_CpuClearFast()` は data で示されるデータを destp で示されるアドレス以下 size バイトに高速に書き込みます。書き込みサイズは4の倍数とする必要があります。32バイト単位で高速に行い、端数は4バイト単位で行います。destp は 4バイト境界に合わせる必要があります。

`SVC_CpuClearArrayFast()` は sizeof( destp )を転送サイズとする `SVC_CpuClearFast()` です。つまり `SVC_CpuClearFast( data ,destp, sizeof(destp) )` と同じです。

## 内部動作

システムコールを呼んでいます。

## 参照

`MI_CpuClear*, MI_CpuFill*, MI_DmaClear*, SVC_CpuCopy*
`

## 履歴

2004/07/20 SVC_CpuClearFast() の転送サイズ条件を32バイトの倍数から4の倍数に変更
2004/03/29 システムコールを用いるということを明記
2004/01/18 初版