2011-11-17 21 views
6

什么是serial copy?它与深拷贝和浅拷贝不同吗?什么是串行复制?为什么它是这样实现的?

根据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 BUFFER。例如。设备的硬件缓冲区。 – 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或类似的信息,然后在编译时向您提供这些信息。有时您需要进行系统调用,告诉您您感兴趣的特定设备的地址已映射到。

相关问题