當(dāng)前位置:首頁 > 模擬 > 模擬
[導(dǎo)讀]MAXQ8913及其它MAXQ®微控制器采用的Harvard存儲器映射架構(gòu)為用戶提供了極大的靈活性,可根據(jù)需要將不同的物理內(nèi)存(例如數(shù)據(jù)SRAM)映射為程序或數(shù)據(jù)內(nèi)存空間。在特定環(huán)境下,從數(shù)據(jù)SRAM執(zhí)行一個程序的部分代碼能夠

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

為了執(zhí)行復(fù)制到RAM中數(shù)據(jù)內(nèi)存地址為0100h的應(yīng)用程序,必須跳至程序地址A100h。

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

org 0080h

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

...

org 0300h

subTw
   call  subOne
   ...and so on...
  
如果兩個例程均被復(fù)制到RAM并在此執(zhí)行,將會發(fā)生什么? 假設(shè)例程均被復(fù)制到RAM中與其在閃存中占用的程序地址相同的數(shù)據(jù)內(nèi)存地址,那么subOne將位于程序地址A080h,subTwo將位于A300h。

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

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

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

subOne  equ  0A080h

org 0080h

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

...

org 0300h

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

這一過程強制編譯器為LCALL使用正確的地址。

將代碼復(fù)制至RAM
在RAM中執(zhí)行代碼之前,必須首先將其復(fù)制到RAM。將大量代碼從閃存復(fù)制到RAM的最簡單方式是使用應(yīng)用ROM copyBuffer函數(shù)。該函數(shù)的輸入?yún)?shù)為兩個數(shù)據(jù)指針(DP[0]和BP[Offs])和一個長度值(LC[0])。它將指定數(shù)量的字節(jié)/字從源地址DP[0]復(fù)制到目標(biāo)地址BP[Offs];一次可復(fù)制最多256個字節(jié)/字。

我們的示例應(yīng)用程序?qū)⑵溟_始的512個字從閃存復(fù)制到RAM,然后跳轉(zhuǎn)至RAM中的副本開始執(zhí)行代碼。源指針(DP[0])指向程序閃存在應(yīng)用ROM的內(nèi)存映射中的地址,從8000h開始。請主意,為了避免無限循環(huán),在復(fù)制RAM的代碼之后,我們跳轉(zhuǎn)至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.


數(shù)據(jù)傳遞操作
如上所述,在RAM中執(zhí)行代碼時,有兩個與內(nèi)存映射相關(guān)的事項發(fā)生了變化。第一,程序閃存現(xiàn)在被映射至數(shù)據(jù)內(nèi)存。這意味著我們可通過任意數(shù)據(jù)指針直接從程序閃存讀取數(shù)據(jù),如下所示。

;; Read the banner string from flash and output it over the serial port.  Since
;; we are running from RAM, we can read from the flash directly without having
;; to use the Utility ROM data transfer functions (moveDP0inc, etc...).

   move    SC.4,  #0
   move    DPC,   #0                  ; Set pointers to byte mode.
   move    DP[0], #(stringData * 2)   ; Point to byte address of string data.

stringLoop:
   move    Acc, @DP[0]++
   sjump   Z, stringEnd
   lcall   #TxChar
   sjump   stringLoop
stringEnd:
   move    DPC, #1Ch         ; Set pointers to word mode.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  This portion of the code (addresses 200h and higher) will remain in flash.

org 0200h

stringData:
   db      0Dh, 0Ah, "Executing code from RAM....", 00h

請注意,如圖1所示,SC.4 (CDA0)位影響將哪一半程序閃存(上半頁或下半頁)以字節(jié)模式映射至數(shù)據(jù)內(nèi)存。當(dāng)使用字模式指針時,整個程序閃存被一次性映射至數(shù)據(jù)內(nèi)存。

第二,現(xiàn)在雖然閃存在數(shù)據(jù)空間可存取,但SRAM不可直接存取。這意味著不能對SRAM的存儲單元進(jìn)行讀或?qū)懖僮?,?yīng)用程序必須采取迂回的方法。從SRAM存儲單元讀取數(shù)據(jù)可按照在閃存中運行的代碼從閃存存儲單元讀取數(shù)據(jù)相同的方式實現(xiàn)—利用應(yīng)用ROM數(shù)據(jù)傳遞函數(shù)(moveDP0inc等)。然而,由于在應(yīng)用ROM中沒有類似的函數(shù)可實現(xiàn)直接寫操作,所以應(yīng)用程序必須提供一個小函數(shù)駐留在閃存中,該函數(shù)可被RAM中駐留的代碼直接調(diào)用來執(zhí)行寫操作。

以下的代碼演示用來讀和寫RAM變量varA的方法,其初始值隨其它部分的應(yīng)用程序被從閃存復(fù)制到RAM,地址范圍為0000h-01FFh。

   scall   printVar
   scall   incrVar
   scall   printVar
   scall   incrVar
   scall   printVar
   scall   incrVar

   move    Acc, #0Dh
   lcall   #TxChar
   move    Acc, #0Ah
   lcall   #TxChar
  
   sjump   $


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Variables stored in RAM (program) space.  They can be read using the
;;  Utility ROM data transfer functions (such as UROM_moveDP0) and written
;;  using the writeDP0 function which remains in flash.
;;

varA:
   dw 'A'


;================================================================
;=
;=  printVar
;=
;=  Reads the varA RAM variable value and sends it over the serial port.
;=

printVar:
   move    DPC, #1Ch         ; Word mode
   move    DP[0], #varA      ; Variable's location in UROM data space
   lcall   UROM_moveDP0      ; Moves variable value into GR.
   move    Acc, GR
   lcall   #TxChar
   ret


;==============================================================
;=
;=  incrVar
;=
;=  Reads the varA RAM variable value, adds 1 to it, and stores it back in RAM.
;=

incrVar:
   move    DPC, #1Ch         ; Word mode
   move    DP[0], #varA      ; Variable's location in UROM data space
   lcall   UROM_moveDP0      ; Moves variable value into GR.

   move    Acc, GR
   add     #1
   move    GR, Acc
   lcall   writeDP0

   ret

;==================================================================
;=
;=  TxChar
;=
;=  Outputs a character to the serial port.
;=
;=  Inputs  : Acc.L - Character to send.
;=

org 01F0h
   move    SBUF, Acc         ; Send character.
TxChar_Loop:
   move    C, SCON.1         ; Check transmit flag.
   sjump   NC, TxChar_Loop   ; Stall until last transmit has completed.
   move    SCON.1, #0        ; Clear the transmit flag.
   ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  This portion of the code (addresses 200h and higher) will remain in flash.

org 0200h

stringData:
   db      0Dh, 0Ah, "Executing code from RAM....", 00h


;===============================================================
;=
;=  WriteRAM
;=
;=  This is a routine that can be called by code running in the RAM to load
;=  a new value into a byte or word location in the RAM.
;=
;=  Inputs  : DP[0] - Location to write (absolute starting at 0000h) in RAM.
;=            GR    - Value to write to the RAM location.
;= 
;=  Notes   : DP[0] must be configured to operate in word or byte mode as
;=            desired before calling this function.  Following a call to this
;=            function, DP[0] must be refreshed before it is used to read data.
;=           

writeDP0:
   move    @DP[0], GR
   ret

在執(zhí)行時,示例代碼通過串口輸出以下的文字(圖2)。


圖2. 示例代碼通過串口的輸出文字

結(jié)論
利用MAXQ8913及其它MAXQ微控制器采用的Harvard內(nèi)存映射架構(gòu),可以將不同的物理內(nèi)存段(例如數(shù)據(jù)SRAM)映射為程序或數(shù)據(jù)內(nèi)存空間。在數(shù)據(jù)SRAM中執(zhí)行部分應(yīng)用程序為性能提升和降低功耗提供了潛力。不過該過程也增加了應(yīng)用程序的復(fù)雜性。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉