新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > MAXQ8913微控制器提升性能并降低功耗的方法

        MAXQ8913微控制器提升性能并降低功耗的方法

        作者: 時間:2011-12-06 來源:網絡 收藏

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

        ;; 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)位影響將哪一半程序閃存(上半頁或下半頁)以字節模式映射至數據內存。當使用字模式指針時,整個程序閃存被一次性映射至數據內存。

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

        以下的代碼演示用來讀和寫RAM變量varA的方法,其初始值隨其它部分的應用程序被從閃存復制到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

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

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


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

        結論
        利用及其它采用的Harvard內存映射架構,可以將不同的物理內存段(例如數據SRAM)映射為程序或數據內存空間。在數據SRAM中執行部分應用程序為性能提升和降提供了潛力。不過該過程也增加了應用程序的復雜性。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 喀喇沁旗| 赤峰市| 江达县| 舟曲县| 濮阳市| 屏东市| 峨边| 石景山区| 四子王旗| 平谷区| 天水市| 兴隆县| 张掖市| 虹口区| 原平市| 荔浦县| 浦江县| 淳化县| 宝山区| 德保县| 海城市| 芦溪县| 台江县| 磴口县| 芜湖县| 郓城县| 白水县| 伊金霍洛旗| 和顺县| 客服| 龙南县| 新干县| 保康县| 揭西县| 平邑县| 林甸县| 泽州县| 麦盖提县| 开阳县| 江陵县| 徐州市|