達(dá)拉斯半導(dǎo)體超高速閃存微控制器具有雙數(shù)據(jù)指針,具有自動(dòng)遞增/遞減和切換選擇功能。本應(yīng)用筆記將采用一個(gè)數(shù)據(jù)指針的原始8051架構(gòu)與DS89C430和DS89C450的新架構(gòu)及其更高的數(shù)據(jù)移動(dòng)效率進(jìn)行了比較。本文提供了大量代碼示例,以幫助理解該超高速微控制器的雙數(shù)據(jù)指針的使用。
概述
嵌入式系統(tǒng)設(shè)計(jì)人員和程序員一直在尋找巧妙的方法來(lái)突破其 8051 微控制器設(shè)計(jì)的性能極限。如果您的應(yīng)用受到微控制器復(fù)制外部數(shù)據(jù)存儲(chǔ)器緩沖器或讀/寫(xiě)存儲(chǔ)器映射外設(shè)的速率的限制,則可能會(huì)受益于使用更多片上硬件和更少軟件的方案。本應(yīng)用筆記介紹了使用定時(shí)器/計(jì)數(shù)器作為終止固定長(zhǎng)度復(fù)制例程的方法。將這種方法與達(dá)拉斯的超高速 8051 架構(gòu)及其數(shù)據(jù)指針增強(qiáng)功能結(jié)合使用,可以以超過(guò) 2MBps 的速率復(fù)制數(shù)據(jù),比以相同時(shí)鐘頻率運(yùn)行并配備單個(gè)數(shù)據(jù)指針的標(biāo)準(zhǔn) 20 內(nèi)核快 8051 倍以上。
XDATA 復(fù)制例程 - 原始 8051
最初的8051架構(gòu)僅包含一個(gè)數(shù)據(jù)指針(DPTR = DPH + DPL),但提供了兩種間接訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)器的不同方式。MOVX指令可以使用16位數(shù)據(jù)指針(例如,MOVX @DPTR,A)或8位工作寄存器(例如,MOVX @R0,A)來(lái)訪(fǎng)問(wèn)MOVX數(shù)據(jù)空間。請(qǐng)注意,后一條指令使用 8 位寄存器指針,因此要求在執(zhí)行指令之前使用指針的最高有效地址字節(jié)寫(xiě)入端口 2。只有一個(gè)數(shù)據(jù)指針,在復(fù)制超過(guò) 256 字節(jié)的數(shù)據(jù)時(shí)管理源指針和目標(biāo)指針需要大量使用工作寄存器進(jìn)行臨時(shí)存儲(chǔ)。下面是使用單個(gè)數(shù)據(jù)指針復(fù)制數(shù)據(jù)時(shí)通常執(zhí)行的代碼示例。
; 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 復(fù)制例程-超高速微控制器
超高速微控制器包含兩個(gè)數(shù)據(jù)指針(DPTR = DPH + DPL;DPTR1 = DPH1 + DPL1),允許單獨(dú)的源和目標(biāo)數(shù)據(jù)指針。此外,它還實(shí)現(xiàn)了硬件控件,以在數(shù)據(jù)指針之間自動(dòng)切換,并自動(dòng)遞增或遞減活動(dòng)數(shù)據(jù)指針,以響應(yīng)某些與 DPTR 相關(guān)的指令。有關(guān)增強(qiáng)型雙數(shù)據(jù)指針的完整詳細(xì)信息,請(qǐng)參閱超高速微控制器用戶(hù)指南。下面的代碼演示了增強(qiáng)的雙數(shù)據(jù)指針如何簡(jiǎn)化復(fù)制例程。自動(dòng)切換活動(dòng)數(shù)據(jù)指針的指令標(biāo)有 [T],自動(dòng)前進(jìn)數(shù)據(jù)指針的指令標(biāo)有 [+/-]。為了與原始8051架構(gòu)進(jìn)行比較,假設(shè)了標(biāo)準(zhǔn)的8051外部P2,P0存儲(chǔ)器總線(xiàn)結(jié)構(gòu),從而給出了5個(gè)時(shí)鐘周期的最小MOVX持續(xù)時(shí)間(1個(gè)時(shí)鐘周期用于MOVX操作碼提取,4個(gè)時(shí)鐘周期用于數(shù)據(jù)存儲(chǔ)器訪(fǎng)問(wèn))。雖然頁(yè)面模式 1 外部總線(xiàn)配置的周期計(jì)數(shù)未反映在下面的代碼示例中,但應(yīng)該注意的是,頁(yè)面模式 1 確實(shí)提供了絕對(duì)的最小外部 MOVX 持續(xù)時(shí)間(3 個(gè)時(shí)鐘周期 = MOVX 操作碼提取的 1 個(gè)時(shí)鐘周期 + 數(shù)據(jù)存儲(chǔ)器訪(fǎng)問(wèn)的 2 個(gè)時(shí)鐘周期)。
; 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 復(fù)制例程 - 使用計(jì)時(shí)器/計(jì)數(shù)器
若要使用計(jì)時(shí)器/計(jì)數(shù)器,應(yīng)用程序必須在復(fù)制例程期間提供計(jì)時(shí)器/計(jì)數(shù)器及其關(guān)聯(lián)的輸入引腳?;舅枷胧鞘褂闷瑑?nèi)計(jì)數(shù)器來(lái)跟蹤和終止復(fù)制環(huán)路,而不是使用工作寄存器。/WR選通用作計(jì)數(shù)器的輸入信號(hào)。圖 1 顯示了一個(gè)硬件配置示例。
圖1.低電平有效WR選通計(jì)數(shù)的硬件圖。
所有超高速微控制器定時(shí)器/計(jì)數(shù)器輸入引腳(T0、T1、T2)都能夠?qū)ο喈?dāng)于系統(tǒng)時(shí)鐘頻率四分之一的輸入頻率進(jìn)行采樣。這意味著要采樣的輸入信號(hào)必須具有最小高電平和低電平時(shí)間,每個(gè)周期為2個(gè)系統(tǒng)時(shí)鐘周期。除了 1 周期或 2 周期尋呼模式 1 中最快的 MOVX 外,/WR 選通器還滿(mǎn)足所有其他外部 MOVX 操作的此標(biāo)準(zhǔn)。在進(jìn)入復(fù)制循環(huán)之前,16 位計(jì)數(shù)器加載適當(dāng)?shù)闹?(216- #bytes復(fù)制),定時(shí)器/計(jì)數(shù)器中斷被啟用,并且增強(qiáng)的數(shù)據(jù)指針配置為最快速的復(fù)制。復(fù)制的最后一個(gè)字節(jié)會(huì)導(dǎo)致計(jì)數(shù)器翻轉(zhuǎn)并生成計(jì)時(shí)器中斷,從而允許將代碼執(zhí)行返回到主程序。
使用定時(shí)器/計(jì)數(shù)器方法的好處
使用計(jì)時(shí)器/計(jì)數(shù)器的主要好處是提高了性能,同時(shí)允許更寬容的 xdata 訪(fǎng)問(wèn)時(shí)間。已經(jīng)注意到,最快的復(fù)制循環(huán)執(zhí)行時(shí)間是通過(guò)將外部總線(xiàn)結(jié)構(gòu)配置為尋呼模式 1(端口 2 = 多路復(fù)用地址 MSB/LSB 和端口 0 = 數(shù)據(jù))來(lái)實(shí)現(xiàn)的。盡管頁(yè)面模式 1 提供了終極性能,但它也需要最快的 xdata 訪(fǎng)問(wèn)時(shí)間 (tRLDV < 中聯(lián)).計(jì)時(shí)器/計(jì)數(shù)器方法提供幾乎相同的性能,同時(shí)使最大 xdata 訪(fǎng)問(wèn)時(shí)間幾乎翻倍。
此外,預(yù)計(jì)并非所有超高速微控制器設(shè)計(jì)都將使用新的總線(xiàn)結(jié)構(gòu)。一些系統(tǒng)設(shè)計(jì)人員可能希望保留傳統(tǒng)的8051總線(xiàn)接口,甚至可能將超高速微控制器放入現(xiàn)有插座中。在這些情況下,計(jì)數(shù)器端接復(fù)制環(huán)路提供了高性能折衷方案。
由于定時(shí)器/計(jì)數(shù)器端接復(fù)制環(huán)路依賴(lài)于內(nèi)部 16 位定時(shí)器硬件來(lái)計(jì)算外部讀/寫(xiě)事件的數(shù)量,因此不需要單獨(dú)的 DJNZ 指令來(lái)跟蹤 16 位環(huán)路控制變量。這允許應(yīng)用程序?qū)Υ笥?256 字節(jié)的數(shù)據(jù)長(zhǎng)度執(zhí)行高速同步傳輸。
表1比較了原始8051架構(gòu)的復(fù)制環(huán)路與三種可能的超高速微控制器配置。計(jì)數(shù)器終止的復(fù)制循環(huán)已突出顯示。下表是計(jì)時(shí)器/計(jì)數(shù)器終止副本的示例代碼清單。代碼中突出顯示了復(fù)制循環(huán),以便與前兩個(gè)示例進(jìn)行比較。
微控制器選項(xiàng) | 持續(xù)時(shí)間(毫秒)(1kbyte xdata copy-loop, sysclk=25MHz) | 快速的 XDATA 訪(fǎng)問(wèn)時(shí)間 (tRLDV)3 | 同步傳輸? | 使用的特殊功能 |
超高速微控制器1 | 0.441 | < 1 x tCLCL | 不 | 頁(yè)面模式 1 總線(xiàn)結(jié)構(gòu) |
超高速微控制器1 | 0.480 | < 2 x tCLC | 是的 | 定時(shí)器/計(jì)數(shù)器和定時(shí)器輸入引腳 |
超高速微控制器1 | 0.601 | < 2 x tCLC | 不 | - |
標(biāo)準(zhǔn) 80512 | 10.568 | < 5 x tCLC | 不 | - |
1機(jī)器周期 = 1 x t中聯(lián);增強(qiáng)型雙數(shù)據(jù)指針,具有自動(dòng) Inc/Dec、自動(dòng)切換功能 2機(jī)器周期 = 12 x t中聯(lián);單個(gè)數(shù)據(jù)指針 3參考單個(gè)器件數(shù)據(jù)表的精確數(shù)據(jù)RLDV最大值。 |
計(jì)數(shù)器終止復(fù)制方法(代碼示例)
;------------------------------------------------------------ ; 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
使用內(nèi)部 XRAM 實(shí)現(xiàn)更高的傳輸速率
使用定時(shí)器/計(jì)數(shù)器提高執(zhí)行效率的基本原理不僅適用于外部數(shù)據(jù)復(fù)制例程,還可用于外部數(shù)據(jù)讀取或?qū)懭雰?nèi)部數(shù)據(jù)存儲(chǔ)器。例如,如果應(yīng)用要求從外部存儲(chǔ)器(或從并行外設(shè))讀取或?qū)懭氩怀^(guò)1024字節(jié),則可以使用DS1C89/430的內(nèi)部450kB數(shù)據(jù)存儲(chǔ)器進(jìn)一步提高傳輸速率。
由于內(nèi)部MOVX操作只需要2個(gè)周期,因此讀/寫(xiě)傳輸環(huán)路(到目前為止一直是討論的主題)可以減少到9個(gè)周期,有效傳輸速率為3.67MBps(@33MHz),并且僅占用4B的代碼空間(下面的代碼)。請(qǐng)記住,兩個(gè)MOVX操作之一,無(wú)論是讀取還是寫(xiě)入,都必須在外部存儲(chǔ)器上執(zhí)行,以便/RD或/WR選通遞遞增加定時(shí)器/計(jì)數(shù)器,最終終止傳輸環(huán)路。下面的第一個(gè)代碼示例給出了對(duì)應(yīng)于外部 MOVX 寫(xiě)入的周期計(jì)數(shù),第二個(gè)示例顯示了外部 MOVX 讀取。另請(qǐng)注意,當(dāng)計(jì)數(shù)/RD信號(hào)時(shí),計(jì)數(shù)器應(yīng)初始化為[216- (#bytes復(fù)制 +1)],以便在循環(huán)中斷之前進(jìn)行最終的字節(jié)寫(xiě)入。
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
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7396瀏覽量
150636 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2248瀏覽量
94181 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3228瀏覽量
114155
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論