達拉斯半導體超高速閃存微控制器具有雙數據指針,具有自動遞增/遞減和切換選擇功能。本應用筆記將采用一個數據指針的原始8051架構與DS89C430和DS89C450的新架構及其更高的數據移動效率進行了比較。本文提供了大量代碼示例,以幫助理解該超高速微控制器的雙數據指針的使用。
概述
嵌入式系統設計人員和程序員一直在尋找巧妙的方法來突破其 8051 微控制器設計的性能極限。如果您的應用受到微控制器復制外部數據存儲器緩沖器或讀/寫存儲器映射外設的速率的限制,則可能會受益于使用更多片上硬件和更少軟件的方案。本應用筆記介紹了使用定時器/計數器作為終止固定長度復制例程的方法。將這種方法與達拉斯的超高速 8051 架構及其數據指針增強功能結合使用,可以以超過 2MBps 的速率復制數據,比以相同時鐘頻率運行并配備單個數據指針的標準 20 內核快 8051 倍以上。
XDATA 復制例程 - 原始 8051
最初的8051架構僅包含一個數據指針(DPTR = DPH + DPL),但提供了兩種間接訪問外部數據存儲器的不同方式。MOVX指令可以使用16位數據指針(例如,MOVX @DPTR,A)或8位工作寄存器(例如,MOVX @R0,A)來訪問MOVX數據空間。請注意,后一條指令使用 8 位寄存器指針,因此要求在執行指令之前使用指針的最高有效地址字節寫入端口 2。只有一個數據指針,在復制超過 256 字節的數據時管理源指針和目標指針需要大量使用工作寄存器進行臨時存儲。下面是使用單個數據指針復制數據時通常執行的代碼示例。
; Original 8051 Copy - Single DPTR ; R6:R7 control copy length ; R4:R0 used for source/dest DPTR hi/lo temp storage loop: ; Cycle Count @ 12clks/cycle movx a,@dptr ; 2 inc dptr ; 2 xch a,r0 ; 1 xch a,dpl ; 1 xch a,r0 ; 1 xch a,r4 ; 1 xch a,dph ; 1 xch a,r4 ; 1 movx @dptr,a ; 2 inc dptr ; 2 xch a,r0 ; 1 xch a,dpl ; 1 xch a,r0 ; 1 xch a,r4 ; 1 xch a,dph ; 1 xch a,r4 ; 1 djnz r7,loop ; 2 => 22cycles * length djnz r6,loop ; 2 => 2cycles * (1 + (length/256))
XDATA 復制例程-超高速微控制器
超高速微控制器包含兩個數據指針(DPTR = DPH + DPL;DPTR1 = DPH1 + DPL1),允許單獨的源和目標數據指針。此外,它還實現了硬件控件,以在數據指針之間自動切換,并自動遞增或遞減活動數據指針,以響應某些與 DPTR 相關的指令。有關增強型雙數據指針的完整詳細信息,請參閱超高速微控制器用戶指南。下面的代碼演示了增強的雙數據指針如何簡化復制例程。自動切換活動數據指針的指令標有 [T],自動前進數據指針的指令標有 [+/-]。為了與原始8051架構進行比較,假設了標準的8051外部P2,P0存儲器總線結構,從而給出了5個時鐘周期的最小MOVX持續時間(1個時鐘周期用于MOVX操作碼提取,4個時鐘周期用于數據存儲器訪問)。雖然頁面模式 1 外部總線配置的周期計數未反映在下面的代碼示例中,但應該注意的是,頁面模式 1 確實提供了絕對的最小外部 MOVX 持續時間(3 個時鐘周期 = MOVX 操作碼提取的 1 個時鐘周期 + 數據存儲器訪問的 2 個時鐘周期)。
; Ultra High-Speed Micro Copy - Enhanced Dual DPTRs ; DPS.4 (AID) = 1; DPS.5 (TSL) = 1; ; R6:R7 control copy length loop: ; Cycle Count @ 1clk/cycle movx a,@dptr ; 5 [T][+/-] movx @dptr,a ; 5 [T][+/-] djnz r7,loop ; 5 => 15 cycles * length djnz r6,loop ; 5 => 5 cycles * (1 +(length/256))
XDATA 復制例程 - 使用計時器/計數器
若要使用計時器/計數器,應用程序必須在復制例程期間提供計時器/計數器及其關聯的輸入引腳。基本思想是使用片內計數器來跟蹤和終止復制環路,而不是使用工作寄存器。/WR選通用作計數器的輸入信號。圖 1 顯示了一個硬件配置示例。
圖1.低電平有效WR選通計數的硬件圖。
所有超高速微控制器定時器/計數器輸入引腳(T0、T1、T2)都能夠對相當于系統時鐘頻率四分之一的輸入頻率進行采樣。這意味著要采樣的輸入信號必須具有最小高電平和低電平時間,每個周期為2個系統時鐘周期。除了 1 周期或 2 周期尋呼模式 1 中最快的 MOVX 外,/WR 選通器還滿足所有其他外部 MOVX 操作的此標準。在進入復制循環之前,16 位計數器加載適當的值 (216- #bytes復制),定時器/計數器中斷被啟用,并且增強的數據指針配置為最快速的復制。復制的最后一個字節會導致計數器翻轉并生成計時器中斷,從而允許將代碼執行返回到主程序。
使用定時器/計數器方法的好處
使用計時器/計數器的主要好處是提高了性能,同時允許更寬容的 xdata 訪問時間。已經注意到,最快的復制循環執行時間是通過將外部總線結構配置為尋呼模式 1(端口 2 = 多路復用地址 MSB/LSB 和端口 0 = 數據)來實現的。盡管頁面模式 1 提供了終極性能,但它也需要最快的 xdata 訪問時間 (tRLDV < 中聯).計時器/計數器方法提供幾乎相同的性能,同時使最大 xdata 訪問時間幾乎翻倍。
此外,預計并非所有超高速微控制器設計都將使用新的總線結構。一些系統設計人員可能希望保留傳統的8051總線接口,甚至可能將超高速微控制器放入現有插座中。在這些情況下,計數器端接復制環路提供了高性能折衷方案。
由于定時器/計數器端接復制環路依賴于內部 16 位定時器硬件來計算外部讀/寫事件的數量,因此不需要單獨的 DJNZ 指令來跟蹤 16 位環路控制變量。這允許應用程序對大于 256 字節的數據長度執行高速同步傳輸。
表1比較了原始8051架構的復制環路與三種可能的超高速微控制器配置。計數器終止的復制循環已突出顯示。下表是計時器/計數器終止副本的示例代碼清單。代碼中突出顯示了復制循環,以便與前兩個示例進行比較。
微控制器選項 | 持續時間(毫秒)(1kbyte xdata copy-loop, sysclk=25MHz) | 快速的 XDATA 訪問時間 (tRLDV)3 | 同步傳輸? | 使用的特殊功能 |
超高速微控制器1 | 0.441 | < 1 x tCLCL | 不 | 頁面模式 1 總線結構 |
超高速微控制器1 | 0.480 | < 2 x tCLC | 是的 | 定時器/計數器和定時器輸入引腳 |
超高速微控制器1 | 0.601 | < 2 x tCLC | 不 | - |
標準 80512 | 10.568 | < 5 x tCLC | 不 | - |
1機器周期 = 1 x t中聯;增強型雙數據指針,具有自動 Inc/Dec、自動切換功能 2機器周期 = 12 x t中聯;單個數據指針 3參考單個器件數據表的精確數據RLDV最大值。 |
計數器終止復制方法(代碼示例)
;------------------------------------------------------------ ; Demonstrate use of Timer/Counter 1 to terminate copy loop ; Use P3.6 (Active-Low WR) as an input to Timer/Counter 1 (P3.5) ; In this example: ; 1) Source, dest, and length defined as constants. ; 2) Code saves only DPTR0 state under the assumption that a ; single DPTR is normally used and that the second (DPTR1) ; is enabled only for certain routines (such as this one). ; 3) Code disables all other interrupts during the copy. ; 4) External non-overlapping xdata to xdata transfer ;------------------------------------------------------------ $include(420.def) ; include file w/SFRs source equ 0100h ; source xdata address dest equ 0200h ; dest xdata address length equ 256d ; #bytes to copy ;------------------------------------------------------------ org 0h ljmp 0100h ;------------------------------------------------------------ ;Timer/Counter 1 interrupt ;------------------------------------------------------------ org 1bh clr tr1 ; disable timer/counter 1 pop acc ; pop 'ajmp' loop addr pop acc ; from the stack pop dps ; return pre-transfer pop dph ; DPTR state pop dpl pop ie ; return interrupt config pop eie reti ; back to instruction ; after "xmemcpy_.." call ;------------------------------------------------------------ ; Main ;------------------------------------------------------------ org 0100h orl tmod, #50h ; 16-bit counter anl ckcon, #0F8h ; fast 2-cycle MOVX call xmemcpy_count ; call xdata copy code sjmp $ ;------------------------------------------------------------ ; 1) Save interrupt enable registers, make only T/C#1 enabled ; 2) Save DPTR0 ; 3) Timer/Counter 1 loaded with (2^16-#bytes to copy) ; 4) Configure source/destination pointers ; 5) Execute copy loop ; - last write rolls the Counter ; - Timer/Counter 1 Interrupt breaks the loop ;------------------------------------------------------------ xmemcpy_count: push eie push ie mov eie, #00h ; disable other ints mov ie, #88h ; EA=1, ET1=1 push dpl ;save DPTR state push dph push dps mov th1, #high(-length) ; copy length mov tl1, #low(-length) setb tr1 ; enable Timer1 orl dps, #30h ; SEL=0,TSL=1, AID=1 mov dptr, #source ; DPTR0 = source addr mov dptr, #dest ; DTPR1 = dest addr transfer: movx a, @dptr ;[5] read from @DPTR0 movx @dptr, a ;[5] write to @DPTR1 ajmp transfer ;[2] in loop etil int ; ---- ; [12] total end
使用內部 XRAM 實現更高的傳輸速率
使用定時器/計數器提高執行效率的基本原理不僅適用于外部數據復制例程,還可用于外部數據讀取或寫入內部數據存儲器。例如,如果應用要求從外部存儲器(或從并行外設)讀取或寫入不超過1024字節,則可以使用DS1C89/430的內部450kB數據存儲器進一步提高傳輸速率。
由于內部MOVX操作只需要2個周期,因此讀/寫傳輸環路(到目前為止一直是討論的主題)可以減少到9個周期,有效傳輸速率為3.67MBps(@33MHz),并且僅占用4B的代碼空間(下面的代碼)。請記住,兩個MOVX操作之一,無論是讀取還是寫入,都必須在外部存儲器上執行,以便/RD或/WR選通遞遞增加定時器/計數器,最終終止傳輸環路。下面的第一個代碼示例給出了對應于外部 MOVX 寫入的周期計數,第二個示例顯示了外部 MOVX 讀取。另請注意,當計數/RD信號時,計數器應初始化為[216- (#bytes復制 +1)],以便在循環中斷之前進行最終的字節寫入。
loop: ; Ultra High-Speed Microcontroller User's Guide Cycle Count / Byte Count movx a,@dptr ; 2 (internal MOVX) / 1 movx @dptr,a ; 5 (external MOVX) / 1 ajmp loop ; 2 / 2 ; 9 cycles / 4 bytes -- OR -- loop: ; Ultra High-Speed Microcontroller User's Guide Cycle Count / Byte Count movx a,@dptr ; 5 (external MOVX) / 1 movx @dptr,a ; 2 (internal MOVX) / 1 ajmp loop ; 2 / 2 ; 9 cycles / 4 bytes
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7547瀏覽量
151326 -
計數器
+關注
關注
32文章
2256瀏覽量
94484 -
定時器
+關注
關注
23文章
3246瀏覽量
114739
發布評論請先 登錄
相關推薦
評論