在MAX-IDE中自動初始化數據段
摘要:該應用筆記討論了MAX-IDE提供的程序和數據段的靈活工具,用于MAXQ®微控制器的應用編程。程序和數據段機制能夠在數據存儲器自動聲明變量位置,并以起始值對這些變量進行初始化。應用程序可以將這些變量值緩存在閃存內,并在需要時恢復這些數據。該方法允許基于匯編語言的應用程序充分利用MAX-IDE提供的數據段自動裝載功能,無論微控制器與JTAG調試器是否連接都能保持工作。MAXQ2000微控制器評估板能夠演示這一方案,本文給出了相應的例程。
本文引用地址:http://www.104case.com/article/156478.htm概述
MAXQ匯編程序的變量可以存儲在工作寄存器(例如累加器A[0]至A[15])或數據存儲器(SRAM)。在數據存儲器中存儲變量能夠為應用程序變量提供較大的工作區域,但需要額外的訪問時間。
MaxQAsm編譯器和MAX-IDE環境提供單獨聲明程序段和數據段的機制,對各段產生各自的hex輸出文件。運行時,MAX-IDE自動將程序段文件裝載到程序存儲器(通常為閃存),將數據段文件裝載到數據存儲器(通常為RAM)。然而,由于數據存儲器為易失存儲器,一旦微控制器掉電,將丟失數據段內容。
本文利用MAXQ2000 EV (評估)板首先演示應用程序開始運行時如何將預裝載數據存儲器值保存到閃存內,隨后演示微控制器重新上電時如何從閃存刷新數據段。無論應用程序處于開發階段(連接到JTAG適配器和MAX-IDE)還是在現場運行,這兩個步驟都允許使用相同的數據段機制聲明和初始化變量。
該應用筆記的例程為MAXQ2000微控制器以及MAXQ2000評估板編寫,但相應程序和原理適用于任何基于MAXQ20、能夠重新編程閃存的微控制器。
提供最新版本的安裝軟件和關于MAX-IDE環境的文檔,可免費下載。
MAX-IDE安裝程序
MAXQ核編譯指南
開發工具指南
變量和存儲位置
嵌入式應用通常需要一定的工作區域存儲狀態信息、配置數據、中間數據、循環計數器以及計算結果。存儲在該工作區域的數據通常作為變量,具有以下特征。
它們是臨時數據。如果應用程序由于電源失效或復位產生中斷,不需要保存這些數據。
它們可頻繁訪問和更新。它們必須存儲在能夠快速讀寫的位置;這些位置的寫入次數必須沒有限制。
它們具有定義的初始值。程序開始運行時,用戶程序必須將它們設置為特定值。
用C語言或其它高級語言編寫的程序編譯成匯編代碼,編譯器通常自動為變量分配空間(同時將變量初始化為預先定義的起始值)。這種情況下,用戶只需聲明變量、變量類型及其初始值(可選),其余工作由編譯器處理。
unsigned int c = 0x1234;
然而,用MAXQ匯編語言編寫應用程序時,必須明確指定變量分配空間并設置變量初始值。這些細節能夠嚴格控制MAXQ微控制器的資源,但增加了系統復雜性。
對于基于匯編的小型應用程序或不需要大量工作區域的應用程序,內部寄存器可用來存儲所有應用程序變量。這種方法具有兩個重要優勢:
程序結構緊湊、運行速度快。根據寄存器位置,在一個指令周期內可實現寄存器變量的讀取、寫入或復制其它寄存器變量。對基于MAXQ20的微控制器,在最差工作條件下,通常最多占用不超過兩個指令周期。
直接操作變量。可直接操作一些內部寄存器。例如,可以(使用AP寄存器)選擇16個工作累加器A[0]至A[15]的任何一個作為有效累加器Acc。這就意味著如果需要對這些寄存器存儲的一個變量進行操作時,可直接對寄存器進行操作,無需將數據復制出來進行操作后再將數據復制回去。同樣,執行djnz指令時,存儲在LC[0]和LC[1]寄存器的變量可直接作為循環計數器。
對于大規模應用程序或者當應用程序需要大量工作變量時,可將其中一些或所有變量存儲在基于SRAM的數據存儲器。這種方式允許創建更多的變量,具體受限于數據存儲器的空間。按照這種方式存儲的變量可以通過MAXQ20核的標準數據指針訪問,該指針用于讀取或寫入字節寬度或字寬變量(注意:本應用筆記的例程假定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
當對一個變量進行一系列的較長計算操作時,可以將變量值首先復制到工作寄存器,如上述例程所示。所有中間操作可利用該工作寄存器執行,完成計算后將變量值復制回來。
MAX-IDE的段聲明
決定在基于SRAM的數據存儲器存儲應用程序變量時,如何確定變量的存儲地址?
通常,除了調試器使用的最高32個字節的存儲空間外,應用程序可以使用其它所有數據存儲器。這意味著聲明一個變量即可定義其在數據存儲器中的位置。程序可通過該地址對變量進行讀寫,用#define宏命令將變量地址和符號名稱關聯起來。
#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
評論