# SVC_CpuCopy*

## 構文

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

      #define SVC_CpuCopy( srcp, destp, size, bit );
      #define SVC_CpuCopyArray( srcp, destp, bit );
      #define SVC_CpuCopyFast( srcp, destp, size );
      #define SVC_CpuCopyArrayFast( srcp, destp );

      (これらはマクロです)

## 引数

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

## 返り値

なし。

## 説明

システムコールを用いてCPUでメモリコピーを行います。
`SVC_CpuCopy*()` はマクロなので、srcp, destp はポインタであれば型は制限されません。size は u32 です。bit は 16 か 32 の即値のみが指定できます。

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

`SVC_CpuCopy()` はsrcp で示されるアドレスから size バイトのデータを destp で示されるアドレスにコピーします。srcp, destp は 転送ビットが16の場合は2バイト境界に、32の場合は4バイト境界に合わせる必要があります。

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

`SVC_CpuCopyFast()` は srcp で示されるアドレスから size バイトのデータを destp で示されるアドレスに高速にコピーします。コピーサイズは4の倍数とする必要があります。32バイト単位で高速に、端数は4バイト単位でコピーを行います。srcp, destp は 4バイト境界に合わせる必要があります。

`SVC_CpuCopyArrayFast()` は sizeof( srcp )を転送サイズとする `SVC_CpuCopyFast()` です。つまり `SVC_CpuCopyFast( srcp, destp, sizeof(srcp) )` と同じです。

## 内部動作

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

## 参照

`MI_CpuCopy*, MI_DmaCopy*, SVC_CpuClear*
`

## 履歴

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