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

          新聞中心

          EEPW首頁 > 手機與無線通信 > 設計應用 > 在MAX-IDE中自動初始化數(shù)據(jù)段

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

          作者: 時間:2011-04-06 來源:網(wǎng)絡 收藏

          這種方案可以很好地工作,但是有幾個問題需要注意。

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

          必須事先定義每個變量的地址,這項工作比較耗時,特別是確定隨后將所有變量移至不同的存儲區(qū)域時。
          必須注意一個以上的變量不要占用同一地址,如果發(fā)生這種錯誤將很難追蹤這些故障。
          變量的(開始)值必須通過應用程序裝載,如上述程序的最后一行。如果有多個變量按照這種方式化將會占用大量的程序空間。
          比較有效的方案是利用機制分別聲明程序段和段。這種方法允許編程人員指定匯編程序的哪一部分定義為程序空間,哪一部分定義為空間。

          segment code

          move DP[0], #VarA ; Point to VarA
          move Acc, @DP[0] ; Get current value of VarA
          add #1 ; Increment it
          move @DP[0], Acc ; Store value back in VarA

          segment data

          VarA:
          dw 0394h ; Initial value for VarA


          利用上述方案,在數(shù)據(jù)段聲明的變量地址由編譯器解析文件時指定,用同樣方法為程序空間分配地址標簽。標簽用于對變量地址指定符號名稱,dw和db聲明可以在化變量時用于設置字寬或字節(jié)寬度初始值。這種情況下,假定匯編文件中事先沒有segment data指令,編譯器將從0000h地址起始數(shù)據(jù)段。這意味著VarA將存儲在字地址0000h。對于程序空間,org聲明將強制變量從指定的起始地址開始存儲。

          數(shù)據(jù)段初始化
          在先前的程序清單中,變量VarA定義(用dw聲明)的初始值為0394h。但是,該值在程序中并不裝載到VarA。那么,如何初始化這一數(shù)值? 答案是在編譯和運行工程時,執(zhí)行數(shù)據(jù)段初始化。

          MaxQAsm編譯器通過產(chǎn)生一個二級hex輸出文件響應segment data指令。通常,為工程產(chǎn)生的hex文件包含程序數(shù)據(jù)。例如,如果編譯工程example.prj,將產(chǎn)生一個名稱為example.hex的hex文件,并包含通過編譯工程文件產(chǎn)生的程序數(shù)據(jù)。如果定義了數(shù)據(jù)段,則將產(chǎn)生一個名稱為example_d.hex的附加hex文件,該文件包含該段編譯數(shù)據(jù)。

          執(zhí)行工程時,檢查是否在工程編譯中產(chǎn)生了數(shù)據(jù)段文件(以_d.hex結尾)。如果存在數(shù)據(jù)段文件,MAX-IDE通過標準的JTAG裝載器將該段數(shù)據(jù)裝載到器件的數(shù)據(jù)SRAM。該過程在標準的hex文件裝載到程序存儲器之后執(zhí)行。

          這種方案能夠很好地工作在開發(fā)階段,當器件連接到JTAG適配器,在應用程序運行之前,MAX-IDE重新裝載程序數(shù)據(jù)和段數(shù)據(jù)。但是,一旦器件掉電并重新上電,而且允許獨立運行(沒有連接調(diào)試器),在每次運行前MAX-IDE將無法正確裝載數(shù)據(jù)段。變量也無法設置在所要求的數(shù)值,導致應用程序不能正確執(zhí)行。這種故障很難分析,因為一旦器件重新連接到調(diào)試器,MAX-IDE將在每次運行前重新開始裝載數(shù)據(jù)段,問題也就消失了。

          保存和恢復數(shù)據(jù)段
          一個遺留問題是:如何使應用程序在連接調(diào)試器(每次運行前MAX-IDE重新裝載程序和數(shù)據(jù))和獨立運行(上電后RAM內(nèi)容不確定)時都能保持工作。顯然,解決方法需要兩個步驟:應用程序將變量值(一旦經(jīng)過初始化)保存到閃存,每次復位或上電后重新裝載這些數(shù)值。

          對于第一步,應用程序必須將數(shù)值保存到閃存。每次主機擦除或裝載程序后第一次運行應用程序時執(zhí)行該操作。

          應用程序檢測“標志”位置以驗證變量之前是否復制到閃存內(nèi)。該標志可以存儲在特殊功能、非易失存儲器,或與變量共用存儲器,只要變量具有非零初始值(與空RAM地址區(qū)分開)。
          應用程序將每個變量值從數(shù)據(jù)RAM復制到閃存,絕大多數(shù)帶有可重復寫操作閃存的MAXQ微控制器(如MAXQ2000)利用UROM_flashWrite函數(shù)實現(xiàn)。
          應用程序在閃存中寫一個標志,表明已經(jīng)存儲變量。
          對于第二步,在后續(xù)的程序運行中,應用程序必須將變量從閃存重新裝載到預先規(guī)定的數(shù)據(jù)RAM地址。

          應用程序檢測閃存的標志位置,以驗證已經(jīng)存儲變量。
          應用程序利用UROM_copyBuffer子程序將變量從閃存復制到數(shù)據(jù)RAM的正確位置。
          以下程序清單展示了利用MAXQ2000評估板的保存-恢復方案,該程序中,變量值存儲在閃存的7000h–71FFh地址內(nèi)。

          $include(maxQ2000.inc)

          ;; Code memory (flash) : 0000h-7FFFh (word addr)
          ;; Data memory (RAM) : 0000h-03FFh (word addr)

          org 0000h

          ljump start ; Skip over password area

          org 0020h

          start:
          move DPC, #1Ch ; Set all pointers to word mode
          move DP[0], #0F000h ; Check first variable value (flag)
          lcall UROM_moveDP0 ; 'move GR, @DP[0]' executed by Utility ROM
          move Acc, GR
          cmp #1234h
          jump NE, copyToFlash



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();