利用Maxim高速微控制器系列中的數(shù)據(jù)指針遞減功能,可以簡化存儲器管理。本應用筆記探討了該系列微控制器在DS80C400、DS5250、DS89C430和其他產(chǎn)品中使用MOVX操作。 示例代碼在執(zhí)行內(nèi)存?zhèn)鬏敳僮鲿r突出顯示 DPTR。
概述
任何微控制器的基本操作之一是能夠存儲和檢索數(shù)據(jù)到內(nèi)存/從內(nèi)存檢索數(shù)據(jù)。MOVX 操作為在 8051 架構(gòu)上執(zhí)行此操作提供了一個工具。應用通常需要微控制器在其MOVX地址空間內(nèi)復制和移動數(shù)據(jù)存儲器塊。當源地址和目標地址范圍不重疊時,此內(nèi)存?zhèn)鬏敳僮鞣浅:唵危吹x/寫循環(huán)。但是,當范圍重疊時,該過程需要一些智能來避免在傳輸原始數(shù)據(jù)之前覆蓋(損壞)原始數(shù)據(jù)。本應用筆記將提供兩種在源緩沖區(qū)和目標緩沖區(qū)之間傳輸數(shù)據(jù)(重疊)的可能解決方案,并解釋Dallas的數(shù)據(jù)指針遞減功能如何簡化解決方案。
重疊內(nèi)存問題
大多數(shù)通用內(nèi)存復制例程不能確定源復制范圍和目標復制范圍是否重疊。如果在執(zhí)行復制例程之前不進行此評估,復制到與原始源范圍重疊的預期目標范圍的字節(jié)可能會覆蓋和損壞原始數(shù)據(jù)。圖 1 給出了如何發(fā)生這種情況的簡單說明。可以看出,目標地址范圍從地址 = 0104h 開始,這也恰好是原始源字節(jié)數(shù)組范圍內(nèi)的地址。如前所述,在這種情況下,標準 memcpy() 例程不會生成所需的目標數(shù)據(jù)數(shù)組。當必須為此類傳輸維護數(shù)據(jù)完整性時,通常使用 memmove() 操作來確保在復制到目標時不會覆蓋源數(shù)組中的字節(jié)。
圖1.問題:內(nèi)存副本重疊。
可能的解決方案
通過一些觀察,可以看到源數(shù)組(在復制之前)發(fā)生的覆蓋可以通過幾種方式避免:1) 確定重疊并首先傳輸源緩沖區(qū)中與所需目標緩沖區(qū)重疊的字節(jié),或 2) 確定重疊并以相反的順序?qū)⒆止?jié)從源緩沖區(qū)傳輸?shù)侥繕司彌_區(qū)。這兩種解決方案如圖 2 和圖 3 所示。請注意,相反方向的重疊(將源數(shù)組復制到內(nèi)存中較低的目標)對于按地址升序傳輸數(shù)據(jù)的標準復制循環(huán)沒有問題。
給定下面的兩個視覺對象(圖 2 和圖 3),人們還應該能夠看到解決方案 #1 在為多個復制操作計算、存儲和傳遞不同的源、目標和長度變量時遭受了額外的開銷,而第二個解決方案只能執(zhí)行此操作一次。
圖2.重疊內(nèi)存復制解決方案 #1。
圖3.重疊內(nèi)存復制解決方案 #2。
達拉斯硬件簡化解決方案 #2
許多達拉斯微控制器產(chǎn)品(附錄 A 中提供的列表)為每個可用數(shù)據(jù)指針實現(xiàn)一個遞增/遞減 (IDx) 位,以指定“INC DPTR”指令是遞增還是遞減活動數(shù)據(jù)指針。使用數(shù)據(jù)指針遞減功能,解決方案 #2 特別容易在 Dallas 產(chǎn)品上實現(xiàn),允許線性傳輸并最大限度地減少執(zhí)行時間。
為了利用數(shù)據(jù)指針遞減功能,應用程序代碼首先必須確定源和目標范圍是否以及如何重疊,即使數(shù)據(jù)指針遞減功能不可用,也會執(zhí)行該任務(wù)。當檢測到有潛在問題的源/目標緩沖區(qū)重疊時,數(shù)據(jù)指針將放置在相應源/目標副本范圍的末尾,并將 IDx 位配置為啟用數(shù)據(jù)指針遞減模式。下面提供了解決方案 #2 的示例代碼。請注意,DPTR 切換(“INC DPS”)和遞增/遞減(“INC DPTR”)功能包含在代碼中,僅用于理解,如果設(shè)置了相應的自動切換和/或自動遞增/遞減位,則可以將其刪除。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7542瀏覽量
151318 -
存儲器
+關(guān)注
關(guān)注
38文章
7484瀏覽量
163766 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74007
發(fā)布評論請先 登錄
相關(guān)推薦
評論