2011-11-17 5 views
6

コピーとは何ですか?ディープコピーとシャローコピーとは違いますか?シリアルコピーとは何ですか?なぜこのように実装されていますか?

Duff's device下のwikiのエントリによると、それは伝統的に次のように実装されます

do {    //count > 0 assumed 
    *to = *from++; //Note that the 'to' pointer is NOT incremented 
} while(--count > 0); 

そしてそれはダフはにコピーされたためtoがインクリメントされていないことを

注意を言って、ノートを作ります1つのメモリマップ出力レジスタ。

私はこのメモを本当に理解しませんでした。

toポインタが増分されていない場合、ループのポイントは何ですか?私はそれがシリアルコピーの定義とは何かを持っている疑いがある

*to = from[count-1]; //does it not do the same thing? 

:として、なぜそれが実装されています。

toにどのようにメモリを割り当てて、ループがいくらか変化するのでしょうか?

+0

おそらくFIFOバッファへのコピーです。例えば。デバイス用のハードウェアバッファ。 – neagoegab

答えて

9

このようなコピーのポイントは、通常のメモリには作成されず、シリアルレジスタに作成される点です。

したがって、レジスタのアドレス(to)に書き込まれるたびに、レジスタに関連付けられたハードウェアは、ビットをシリアルリンク経由で送信するか、または他のハードウェアのキューにプッシュするような処理を行います対処する。

通常、このようなレジスタアドレスから読み取ることさえできないので、通常のmemoryとは非常に異なり、メモリアドレスに配置された特定のハードウェアへのインターフェイスとして最もよく考えられます。

4

http://en.wikipedia.org/wiki/Memory-mapped_I/O#Example

一部のプラットフォームでは、/書き込みから、それを読んだとき、システムはいくつかのI/Oを実行することを特別なアドレスを持っています。たとえば、toは、スピーカーを制御するアドレスにすることができます。その場合、ループは、例えば、次のようになる。 *to = from[count-1];は有用な出力を与えませんが、サウンドを再生することができます。

+0

私はこれを理解し始めました。これについてもっと詳しく教えていただけますか? – Nawaz

2

toポインタは「特別」です。特定のハードウェアでは、特別なメモリ領域に書き込むことによってIOポートにアクセスできます。 IOポートを介してビットパターンを送信したい場合は、パターンがすでにメモリに格納されていますが、これはあなたがやることのようなものです。

toに書き込むたびに、通常、IOポートからの出力が変更されます。これは、パターンを反復し、それを「特別な」メモリに書き込むためです。

このような「特別な」メモリへのアクセス方法は、プラットフォームと実装に固有です。コンパイル時にその情報を利用できるようにするために、通常は固定アドレスに書き込むことが問題になることがあります。通常、プラットフォームヘッダには#defineなどがあります。場合によっては、システムコールが必要です。興味のある特定のデバイスがマップされているアドレスを通知します。