<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > 在MAXQ8913微控制器中從RAM執行應用程序

在MAXQ8913微控制器中從RAM執行應用程序

作者: 時(shí)間:2010-01-13 來(lái)源:網(wǎng)絡(luò ) 收藏

及其它®采用的Harvard存儲器映射架構為用戶(hù)提供了極大的靈活性,可根據需要將不同的物理內存(例如數據S)映射為程序或數據內存空間。在特定環(huán)境下,從數據S執行一個(gè)程序的部分代碼能夠提升性能并降低功耗。這些優(yōu)勢都是以應用程序的更加復雜為代價(jià)。

本文引用地址:http://dyxdggzs.com/article/188391.htm

概述
和其它許多MAXQ一樣,也包含了一個(gè)基于S的內置數據存儲區域,該存儲區域可被映射為數據內存空間,或者選擇映射為程序內存空間。內置SRAM通常用作數據存儲器,而在程序閃存或掩膜ROM中執行大部分程序代碼。然而,在特定環(huán)境下,從內部SRAM執行有限的部分代碼非常有用。

本應用筆記介紹如何配置、裝載匯編程序,以便從內部SRAM正確運行,本文還討論了這種方法的優(yōu)勢和缺點(diǎn)。本應用筆記給出的例程針對MAXQ編寫(xiě),使用基于匯編的MAX-IDE環(huán)境。用戶(hù)可下載本文所涉及的應用程序代碼和項目文件。

本文討論的代碼都特別針對MAXQ8913編寫(xiě),所介紹的原理和方法也同樣適合其它含有可映射為程序空間的內部SRAM的MAXQ微控制器。能夠以這種方式執行代碼的其它MAXQ微控制器包括:MAXQ2000、MAXQ2010和MAXQ3210/MAXQ3212。

該代碼能很好地運行在任何基于MAXQ8913并為MAXQ8913的串口0提供一路串行接口(RS-232或USB至串口轉換)的硬件。將一個(gè)終端模擬器連接到該串口,并設置為9600波特率、8個(gè)數據位、1個(gè)停止位、無(wú)奇偶校驗,即可查看例程的代碼輸出。

用戶(hù)可免費下載MAX-IDE環(huán)境的最新安裝程序包和文檔資料。

MAX-IDE安裝程序
MAXQ核編譯指南
開(kāi)發(fā)工具指南
在RAM中執行代碼的優(yōu)勢
通常情況下,MAXQ微控制器的絕大多數應用代碼都被設計為在主程序空間執行,主程序空間通常是利用一片大的內部閃存或(對于掩膜ROM器件)用戶(hù)指定的應用ROM來(lái)實(shí)現。主程序空間為非易失存儲器,所以大多數情況下可用來(lái)保存應用程序代碼。內部SRAM被用來(lái)存儲變量、軟件棧,以及器件被關(guān)閉時(shí)不需要保存的類(lèi)似數據。

然而,對于特定應用,在數據SRAM中執行某些代碼具有一定優(yōu)勢。

降低功耗
在大多數MAXQ微控制器中,當在內部SRAM (或固定用途ROM)中執行代碼時(shí),相對于程序閃存而言,電源電流會(huì )減小。因為閃存在不被存取時(shí)可被動(dòng)態(tài)斷電,所以這種情況下就能節省功率。如果某個(gè)應用程序通常在大部分活動(dòng)時(shí)間內執行非常小的代碼量,在SRAM中執行就能大大降低總體功耗。

直接訪(fǎng)問(wèn)主程序空間存儲器
通常,從主程序閃存執行的代碼不能直接讀取保存在主程序閃存中的數據。這種類(lèi)型的數據可以包括隨應用程序數據一起的常量字符串和數據表。若要讀取該數據,應用程序必須調用固定用途ROM中的專(zhuān)用數據傳遞函數。在RAM中執行代碼則避開(kāi)了這一限制,允許利用標準的數據指針直接讀取閃存中包含的數據。這就加快了存取操作。若一個(gè)小的算法花費大量的時(shí)間遍歷閃存中存儲的查找表或其它常量數據,那么在RAM中執行該算法則能夠在非常短的時(shí)間內完成運算。

可重寫(xiě)整個(gè)閃存
和大多數基于閃存的MAXQ微控制器一樣,MAXQ8913中的固定用途ROM含有在應用程序控制下擦除和重寫(xiě)程序閃存的標準函數。該過(guò)程能夠使用戶(hù)裝載器通過(guò)用戶(hù)指定接口(例如串口、SPI或I²C)重新裝載部分或全部應用程序。然而,若用戶(hù)裝載程序位于閃存內,則不能擦除或重寫(xiě)自身所占用的閃存。在RAM中執行用戶(hù)裝載器,可以擦除整個(gè)閃存程序空間并重新寫(xiě)入新的代碼,包括用戶(hù)裝載器本身。

在RAM中執行代碼的缺點(diǎn)
在RAM中執行應用程序代碼也存在缺點(diǎn)和限制。有些缺點(diǎn)與具體工作相關(guān),而有些缺點(diǎn)則是MAXQ架構所固有的。

有限的代碼空間
RAM一般比程序閃存小得多,這意味著(zhù)在任何給定時(shí)間只能執行少量代碼。但有可能在RAM中運行一個(gè)例程,然后將其擦除并裝載第二個(gè)例程,隨后再運行第二個(gè)例程,依此類(lèi)推。

代碼映射
在RAM中執行代碼之前,必須將其復制到RAM。這一過(guò)程需要時(shí)間和代碼空間。此外,代碼必須從某個(gè)位置復制,所以代碼實(shí)際上被存儲兩次:一次在閃存或程序ROM,一次在RAM。即使該代碼不是為了在閃存中執行,也必須被存儲于其中,從而消耗了額外的空間。

不可直接存取RAM
當在RAM中執行代碼時(shí),RAM就不再是可見(jiàn)的數據存儲空間。這意味著(zhù)不能利用數據指針直接從RAM存儲單元讀取或寫(xiě)入數據。按照在閃存中運行應用代碼相同的方式,有可能避開(kāi)這種限制。利用固定用途ROM數據傳遞函數(UROM_moveDP0和類(lèi)似的函數)可對RAM進(jìn)行讀取,以及通過(guò)在閃存中寫(xiě)入類(lèi)似的函數,可直接對RAM進(jìn)行寫(xiě)操作。然而,這種迂回方法也占用額外的時(shí)間和應用程序空間。

編譯在RAM中執行的代碼
在編寫(xiě)將要在數據RAM中執行的應用代碼時(shí),必須要考慮一項主要因素。代碼的每個(gè)字都將被編譯至一個(gè)地址并被裝載至該地址的閃存中,但是將在不同地址的RAM中執行。例如,如果一段代碼被裝載至以程序字地址0100h開(kāi)始的閃存中,并被復制到以數據字地址0100h開(kāi)始的RAM中,在RAM中就不可能跳至地址0100h來(lái)執行代碼。在閃存中,地址0100h仍然是代碼的地址。在程序空間中,RAM中代碼的地址是其數據存儲地址加上偏移量A000h,如圖1所示。

圖1. MAXQ8913在RAM中執行代碼時(shí)的內存映射
圖1. MAXQ8913在RAM中執行代碼時(shí)的內存映射

為了執行復制到RAM中數據內存地址為0100h的應用程序,必須跳至程序地址A100h。

在RAM中執行代碼會(huì )為MAX-IDE編譯器造成困難。MAX-IDE并不知道將在與編譯地址不同的地址執行代碼。例如,假設一個(gè)例程調用了閃存地址為0080h的subOne,而另一個(gè)位于0300h的例程調用了第一個(gè)例程。其代碼如下所示。

org 0080h

subOne:
....perform various calculations...
ret

...

org 0300h

subTw
call subOne
...and so on...

如果兩個(gè)例程均被復制到RAM并在此執行,將會(huì )發(fā)生什么? 假設例程均被復制到RAM中與其在閃存中占用的程序地址相同的數據內存地址,那么subOne將位于程序地址A080h,subTwo將位于A(yíng)300h。

因為“call subOne”所在行與目標端標簽subOne之間的距離超過(guò)了相對跳轉距離(+127/-128個(gè)字),所以指令就必須被重新編譯為絕對LCALL。然而,編譯器所持有的subOne的唯一地址是0080h,所以指令將被編譯為“LCALL 0080h”。當subTwo執行時(shí),它將不調用位于RAM中的subOne副本,而是調用位于閃存中的版本。

有兩種迂回方法可能解決這種困境。第一種方法也是最簡(jiǎn)單的方法,即強制編譯器始終使用相對跳轉和調用,并使例程在RAM中離得足夠近,使其能夠按照這一方式調用其它例程??偸鞘褂肧JUMP和SCALL,而不是JUMP和CALL機器碼(使編譯器可選擇短或長(cháng)跳轉)。這將強制使用指令的相對跳轉版本。

然而,這種方法也存在限制。如果在RAM中運行的代碼量長(cháng)于128個(gè)字,相對跳轉就有可能不足以長(cháng)到使RAM中的一個(gè)例程調用另一個(gè)例程。這種情況下的解決方法是通過(guò)ORG聲明為不同的例程使用固定的地址,然后定義包含其在RAM中的正確地址的等價(jià)變量。這些等價(jià)變量可被用于LCALL和LJUMP聲明中,如下所示。

subOne equ 0A080h

org 0080h

; subOne
....perform various calculations...
ret

...

org 0300h

subTw
lcall #subOne
...and so on...

這一過(guò)程強制編譯器為L(cháng)CALL使用正確的地址。

將代碼復制至RAM
在RAM中執行代碼之前,必須首先將其復制到RAM。將大量代碼從閃存復制到RAM的最簡(jiǎn)單方式是使用應用ROM copyBuffer函數。該函數的輸入參數為兩個(gè)數據指針(DP[0]和BP[Offs])和一個(gè)長(cháng)度值(LC[0])。它將指定數量的字節/字從源地址DP[0]復制到目標地址BP[Offs];一次可復制最多256個(gè)字節/字。

我們的示例應用程序將其開(kāi)始的512個(gè)字從閃存復制到RAM,然后跳轉至RAM中的副本開(kāi)始執行代碼。源指針(DP[0])指向程序閃存在應用ROM的內存映射中的地址,從8000h開(kāi)始。請主意,為了避免無(wú)限循環(huán),在復制RAM的代碼之后,我們跳轉至RAM中副本的部分。

org 0020h

copyToRAM:
move DPC, #1Ch ; Ensure all pointers are operating in word mode.
move DP[0], #8000h ; Start of program flash from UROM's perspective.
move BP, #0 ; Start of data memory.
move Offs, #0
move LC[0], #256 ; The Offs register limits us to a 256-word copy.
lcall UROM_copyBuffer

move DP[0], #8100h ; Copy second half.
move BP, #0100h
move Offs, #0
move LC[0], #256
lcall UROM_copyBuffer

ljump #0A040h ; Begin execution of code from RAM.


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Executing from RAM
;;

org 0040h

move LC[0], #1000
delayLoop:
move LC[1], #8000
sdjnz LC[1], $
sdjnz LC[0], delayLoop

;; Initialize serial port.

move SCON.6, #1 ; Set to mode 1 (10-bit asynchronous).
move SMD.1, #1 ; Baud rate = 16 x baud clock
move PR, #009D4h ; P = 2^21 * 9600/8.000MHz
move SCON.1, #0 ; Clear transmit character flag.


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: MAXQ 8913 RAM 微控制器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>