<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > 在MAX-IDE中自動(dòng)初始化數(shù)據(jù)段

          在MAX-IDE中自動(dòng)初始化數(shù)據(jù)段

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

          摘要:該應(yīng)用筆記討論了提供的程序和段的靈活工具,用于MAXQ®微控制器的應(yīng)用編程。程序和段機(jī)制能夠在存儲(chǔ)器聲明變量位置,并以起始值對(duì)這些變量進(jìn)行化。應(yīng)用程序可以將這些變量值緩存在閃存內(nèi),并在需要時(shí)恢復(fù)這些數(shù)據(jù)。該方法允許基于匯編語(yǔ)言的應(yīng)用程序充分利用提供的數(shù)據(jù)段裝載功能,無(wú)論微控制器與JTAG調(diào)試器是否連接都能保持工作。MAXQ2000微控制器評(píng)估板能夠演示這一方案,本文給出了相應(yīng)的例程。

          本文引用地址:http://www.ex-cimer.com/article/156478.htm

          概述
          MAXQ匯編程序的變量可以存儲(chǔ)在工作寄存器(例如累加器A[0]至A[15])或數(shù)據(jù)存儲(chǔ)器(SRAM)。在數(shù)據(jù)存儲(chǔ)器中存儲(chǔ)變量能夠?yàn)閼?yīng)用程序變量提供較大的工作區(qū)域,但需要額外的訪問(wèn)時(shí)間。

          MaxQAsm編譯器和環(huán)境提供單獨(dú)聲明程序段和數(shù)據(jù)段的機(jī)制,對(duì)各段產(chǎn)生各自的hex輸出文件。運(yùn)行時(shí),MAX-IDE將程序段文件裝載到程序存儲(chǔ)器(通常為閃存),將數(shù)據(jù)段文件裝載到數(shù)據(jù)存儲(chǔ)器(通常為RAM)。然而,由于數(shù)據(jù)存儲(chǔ)器為易失存儲(chǔ)器,一旦微控制器掉電,將丟失數(shù)據(jù)段內(nèi)容。

          本文利用MAXQ2000 EV (評(píng)估)板首先演示應(yīng)用程序開(kāi)始運(yùn)行時(shí)如何將預(yù)裝載數(shù)據(jù)存儲(chǔ)器值保存到閃存內(nèi),隨后演示微控制器重新上電時(shí)如何從閃存刷新數(shù)據(jù)段。無(wú)論應(yīng)用程序處于開(kāi)發(fā)階段(連接到JTAG適配器和MAX-IDE)還是在現(xiàn)場(chǎng)運(yùn)行,這兩個(gè)步驟都允許使用相同的數(shù)據(jù)段機(jī)制聲明和化變量。

          該應(yīng)用筆記的例程為MAXQ2000微控制器以及MAXQ2000評(píng)估板編寫(xiě),但相應(yīng)程序和原理適用于任何基于MAXQ20、能夠重新編程閃存的微控制器。

          提供最新版本的安裝軟件和關(guān)于MAX-IDE環(huán)境的文檔,可免費(fèi)下載。

          MAX-IDE安裝程序
          MAXQ核編譯指南
          開(kāi)發(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ù)。
          它們可頻繁訪問(wèn)和更新。它們必須存儲(chǔ)在能夠快速讀寫(xiě)的位置;這些位置的寫(xiě)入次數(shù)必須沒(méi)有限制。
          它們具有定義的值。程序開(kāi)始運(yùn)行時(shí),用戶程序必須將它們?cè)O(shè)置為特定值。
          用C語(yǔ)言或其它高級(jí)語(yǔ)言編寫(xiě)的程序編譯成匯編代碼,編譯器通常自動(dòng)為變量分配空間(同時(shí)將變量初始化為預(yù)先定義的起始值)。這種情況下,用戶只需聲明變量、變量類型及其初始值(可選),其余工作由編譯器處理。

          unsigned int c = 0x1234;

          然而,用MAXQ匯編語(yǔ)言編寫(xiě)應(yīng)用程序時(shí),必須明確指定變量分配空間并設(shè)置變量初始值。這些細(xì)節(jié)能夠嚴(yán)格控制MAXQ微控制器的資源,但增加了系統(tǒng)復(fù)雜性。

          對(duì)于基于匯編的小型應(yīng)用程序或不需要大量工作區(qū)域的應(yīng)用程序,內(nèi)部寄存器可用來(lái)存儲(chǔ)所有應(yīng)用程序變量。這種方法具有兩個(gè)重要優(yōu)勢(shì):

          程序結(jié)構(gòu)緊湊、運(yùn)行速度快。根據(jù)寄存器位置,在一個(gè)指令周期內(nèi)可實(shí)現(xiàn)寄存器變量的讀取、寫(xiě)入或復(fù)制其它寄存器變量。對(duì)基于MAXQ20的微控制器,在最差工作條件下,通常最多占用不超過(guò)兩個(gè)指令周期。
          直接操作變量。可直接操作一些內(nèi)部寄存器。例如,可以(使用AP寄存器)選擇16個(gè)工作累加器A[0]至A[15]的任何一個(gè)作為有效累加器Acc。這就意味著如果需要對(duì)這些寄存器存儲(chǔ)的一個(gè)變量進(jìn)行操作時(shí),可直接對(duì)寄存器進(jìn)行操作,無(wú)需將數(shù)據(jù)復(fù)制出來(lái)進(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ǔ)的變量可以通過(guò)MAXQ20核的標(biāo)準(zhǔn)數(shù)據(jù)指針訪問(wèn),該指針用于讀取或?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)行一系列的較長(zhǎng)計(jì)算操作時(shí),可以將變量值首先復(fù)制到工作寄存器,如上述例程所示。所有中間操作可利用該工作寄存器執(zhí)行,完成計(jì)算后將變量值復(fù)制回來(lái)。

          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ǔ)器中的位置。程序可通過(guò)該地址對(duì)變量進(jìn)行讀寫(xiě),用#define宏命令將變量地址和符號(hào)名稱關(guān)聯(lián)起來(lái)。

          #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


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

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();