在MAX-IDE中自動(dòng)初始化數(shù)據(jù)段
摘要:該應(yīng)用筆記討論了MAX-IDE提供的程序和數(shù)據(jù)段的靈活工具,用于MAXQ®微控制器的應(yīng)用編程。程序和數(shù)據(jù)段機(jī)制能夠在數(shù)據(jù)存儲(chǔ)器自動(dòng)聲明變量位置,并以起始值對(duì)這些變量進(jìn)行初始化。應(yīng)用程序可以將這些變量值緩存在閃存內(nèi),并在需要時(shí)恢復(fù)這些數(shù)據(jù)。該方法允許基于匯編語言的應(yīng)用程序充分利用MAX-IDE提供的數(shù)據(jù)段自動(dòng)裝載功能,無論微控制器與JTAG調(diào)試器是否連接都能保持工作。MAXQ2000微控制器評(píng)估板能夠演示這一方案,本文給出了相應(yīng)的例程。
本文引用地址:http://butianyuan.cn/article/156478.htm概述
MAXQ匯編程序的變量可以存儲(chǔ)在工作寄存器(例如累加器A[0]至A[15])或數(shù)據(jù)存儲(chǔ)器(SRAM)。在數(shù)據(jù)存儲(chǔ)器中存儲(chǔ)變量能夠?yàn)閼?yīng)用程序變量提供較大的工作區(qū)域,但需要額外的訪問時(shí)間。
MaxQAsm編譯器和MAX-IDE環(huán)境提供單獨(dú)聲明程序段和數(shù)據(jù)段的機(jī)制,對(duì)各段產(chǎn)生各自的hex輸出文件。運(yùn)行時(shí),MAX-IDE自動(dòng)將程序段文件裝載到程序存儲(chǔ)器(通常為閃存),將數(shù)據(jù)段文件裝載到數(shù)據(jù)存儲(chǔ)器(通常為RAM)。然而,由于數(shù)據(jù)存儲(chǔ)器為易失存儲(chǔ)器,一旦微控制器掉電,將丟失數(shù)據(jù)段內(nèi)容。
本文利用MAXQ2000 EV (評(píng)估)板首先演示應(yīng)用程序開始運(yùn)行時(shí)如何將預(yù)裝載數(shù)據(jù)存儲(chǔ)器值保存到閃存內(nèi),隨后演示微控制器重新上電時(shí)如何從閃存刷新數(shù)據(jù)段。無論應(yīng)用程序處于開發(fā)階段(連接到JTAG適配器和MAX-IDE)還是在現(xiàn)場運(yùn)行,這兩個(gè)步驟都允許使用相同的數(shù)據(jù)段機(jī)制聲明和初始化變量。
該應(yīng)用筆記的例程為MAXQ2000微控制器以及MAXQ2000評(píng)估板編寫,但相應(yīng)程序和原理適用于任何基于MAXQ20、能夠重新編程閃存的微控制器。
提供最新版本的安裝軟件和關(guān)于MAX-IDE環(huán)境的文檔,可免費(fèi)下載。
MAX-IDE安裝程序
MAXQ核編譯指南
開發(fā)工具指南
變量和存儲(chǔ)位置
嵌入式應(yīng)用通常需要一定的工作區(qū)域存儲(chǔ)狀態(tài)信息、配置數(shù)據(jù)、中間數(shù)據(jù)、循環(huán)計(jì)數(shù)器以及計(jì)算結(jié)果。存儲(chǔ)在該工作區(qū)域的數(shù)據(jù)通常作為變量,具有以下特征。
它們是臨時(shí)數(shù)據(jù)。如果應(yīng)用程序由于電源失效或復(fù)位產(chǎn)生中斷,不需要保存這些數(shù)據(jù)。
它們可頻繁訪問和更新。它們必須存儲(chǔ)在能夠快速讀寫的位置;這些位置的寫入次數(shù)必須沒有限制。
它們具有定義的初始值。程序開始運(yùn)行時(shí),用戶程序必須將它們?cè)O(shè)置為特定值。
用C語言或其它高級(jí)語言編寫的程序編譯成匯編代碼,編譯器通常自動(dòng)為變量分配空間(同時(shí)將變量初始化為預(yù)先定義的起始值)。這種情況下,用戶只需聲明變量、變量類型及其初始值(可選),其余工作由編譯器處理。
unsigned int c = 0x1234;
然而,用MAXQ匯編語言編寫應(yīng)用程序時(shí),必須明確指定變量分配空間并設(shè)置變量初始值。這些細(xì)節(jié)能夠嚴(yán)格控制MAXQ微控制器的資源,但增加了系統(tǒng)復(fù)雜性。
對(duì)于基于匯編的小型應(yīng)用程序或不需要大量工作區(qū)域的應(yīng)用程序,內(nèi)部寄存器可用來存儲(chǔ)所有應(yīng)用程序變量。這種方法具有兩個(gè)重要優(yōu)勢:
程序結(jié)構(gòu)緊湊、運(yùn)行速度快。根據(jù)寄存器位置,在一個(gè)指令周期內(nèi)可實(shí)現(xiàn)寄存器變量的讀取、寫入或復(fù)制其它寄存器變量。對(duì)基于MAXQ20的微控制器,在最差工作條件下,通常最多占用不超過兩個(gè)指令周期。
直接操作變量??芍苯硬僮饕恍﹥?nèi)部寄存器。例如,可以(使用AP寄存器)選擇16個(gè)工作累加器A[0]至A[15]的任何一個(gè)作為有效累加器Acc。這就意味著如果需要對(duì)這些寄存器存儲(chǔ)的一個(gè)變量進(jìn)行操作時(shí),可直接對(duì)寄存器進(jìn)行操作,無需將數(shù)據(jù)復(fù)制出來進(jìn)行操作后再將數(shù)據(jù)復(fù)制回去。同樣,執(zhí)行djnz指令時(shí),存儲(chǔ)在LC[0]和LC[1]寄存器的變量可直接作為循環(huán)計(jì)數(shù)器。
對(duì)于大規(guī)模應(yīng)用程序或者當(dāng)應(yīng)用程序需要大量工作變量時(shí),可將其中一些或所有變量存儲(chǔ)在基于SRAM的數(shù)據(jù)存儲(chǔ)器。這種方式允許創(chuàng)建更多的變量,具體受限于數(shù)據(jù)存儲(chǔ)器的空間。按照這種方式存儲(chǔ)的變量可以通過MAXQ20核的標(biāo)準(zhǔn)數(shù)據(jù)指針訪問,該指針用于讀取或?qū)懭胱止?jié)寬度或字寬變量(注意:本應(yīng)用筆記的例程假定DP[0]配置為工作在字模式)。
move DP[0], #0010h ; Location of variable in data memory
move Acc, @DP[0] ; Read variable
add #1 ; Increment variable value by 1
move @DP[0], Acc ; Store variable back in data memory
當(dāng)對(duì)一個(gè)變量進(jìn)行一系列的較長計(jì)算操作時(shí),可以將變量值首先復(fù)制到工作寄存器,如上述例程所示。所有中間操作可利用該工作寄存器執(zhí)行,完成計(jì)算后將變量值復(fù)制回來。
MAX-IDE的段聲明
決定在基于SRAM的數(shù)據(jù)存儲(chǔ)器存儲(chǔ)應(yīng)用程序變量時(shí),如何確定變量的存儲(chǔ)地址?
通常,除了調(diào)試器使用的最高32個(gè)字節(jié)的存儲(chǔ)空間外,應(yīng)用程序可以使用其它所有數(shù)據(jù)存儲(chǔ)器。這意味著聲明一個(gè)變量即可定義其在數(shù)據(jù)存儲(chǔ)器中的位置。程序可通過該地址對(duì)變量進(jìn)行讀寫,用#define宏命令將變量地址和符號(hào)名稱關(guān)聯(lián)起來。
#define VarA #0020h
#define VarB #0021h
#define VarC #0022h
move DP[0], VarA ; Point to VarA variable
move Acc, @DP[0] ; Read value of variable
move DP[0], VarB ; Point to VarB variable
move @DP[0], Acc ; Copy VarA to VarB
move DP[0], VarC ; Point to VarC variable
move @DP[0], #1234h ; Set VarC = 1234h
評(píng)論