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