2011-11-17 1 views
6

연속 복사입니까? 딥 카피 및 얕은 카피와 다른 점은 무엇입니까?연속 복사본이란 무엇입니까? 왜 이런 식으로 구현됩니까?

Duff's device에서 위키 항목에 따르면, 전통적으로 구현됩니다 :

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

그리고 그것은 가짜가 복사 되었기 때문에 to이 증가되지 않도록

주 말, 메모를한다 단일 메모리 맵핑 출력 레지스터.

이 메모를 실제로 이해하지 못했습니다.

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 또는 그 유사 정보를 제공하므로 컴파일 할 때 해당 정보를 사용할 수 있습니다. 때로는 시스템 호출이 필요합니다.이 시스템 호출을 사용하면 원하는 특정 장치가 매핑 된 주소를 알 수 있습니다.