2011-11-17 128 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或類似的信息,然後在編譯時向您提供這些信息。有時您需要進行系統調用,告訴您您感興趣的特定設備的地址已映射到。

相關問題