在MAX-IDE中自動(dòng)初始化數(shù)據(jù)段
這種方案可以很好地工作,但是有幾個(gè)問題需要注意。本文引用地址:http://m.butianyuan.cn/article/156478.htm
必須事先定義每個(gè)變量的地址,這項(xiàng)工作比較耗時(shí),特別是確定隨后將所有變量移至不同的數(shù)據(jù)存儲(chǔ)區(qū)域時(shí)。
必須注意一個(gè)以上的變量不要占用同一地址,如果發(fā)生這種錯(cuò)誤將很難追蹤這些故障。
變量的初始(開始)值必須通過應(yīng)用程序裝載,如上述程序的最后一行。如果有多個(gè)變量按照這種方式初始化將會(huì)占用大量的程序空間。
比較有效的方案是利用MAX-IDE機(jī)制分別聲明程序段和數(shù)據(jù)段。這種方法允許編程人員指定匯編程序的哪一部分定義為程序空間,哪一部分定義為數(shù)據(jù)空間。
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ù)段聲明的變量地址由編譯器解析文件時(shí)自動(dòng)指定,用同樣方法為程序空間分配地址標(biāo)簽。標(biāo)簽用于對(duì)變量地址指定符號(hào)名稱,dw和db聲明可以在初始化變量時(shí)用于設(shè)置字寬或字節(jié)寬度初始值。這種情況下,假定匯編文件中事先沒有segment data指令,編譯器將從0000h地址起始數(shù)據(jù)段。這意味著VarA將存儲(chǔ)在字地址0000h。對(duì)于程序空間,org聲明將強(qiáng)制變量從指定的起始地址開始存儲(chǔ)。
數(shù)據(jù)段初始化
在先前的程序清單中,變量VarA定義(用dw聲明)的初始值為0394h。但是,該值在程序中并不裝載到VarA。那么,如何初始化這一數(shù)值? 答案是在編譯和運(yùn)行工程時(shí),MAX-IDE將自動(dòng)執(zhí)行數(shù)據(jù)段初始化。
MaxQAsm編譯器通過產(chǎn)生一個(gè)二級(jí)hex輸出文件響應(yīng)segment data指令。通常,為工程產(chǎn)生的hex文件包含程序數(shù)據(jù)。例如,如果編譯工程example.prj,將產(chǎn)生一個(gè)名稱為example.hex的hex文件,并包含通過編譯工程文件產(chǎn)生的程序數(shù)據(jù)。如果定義了數(shù)據(jù)段,則將產(chǎn)生一個(gè)名稱為example_d.hex的附加hex文件,該文件包含該段編譯數(shù)據(jù)。
執(zhí)行工程時(shí),MAX-IDE檢查是否在工程編譯中產(chǎn)生了數(shù)據(jù)段文件(以_d.hex結(jié)尾)。如果存在數(shù)據(jù)段文件,MAX-IDE通過標(biāo)準(zhǔn)的JTAG裝載器將該段數(shù)據(jù)裝載到器件的數(shù)據(jù)SRAM。該過程在標(biāo)準(zhǔn)的hex文件裝載到程序存儲(chǔ)器之后執(zhí)行。
這種方案能夠很好地工作在開發(fā)階段,當(dāng)器件連接到JTAG適配器,在應(yīng)用程序運(yùn)行之前,MAX-IDE重新裝載程序數(shù)據(jù)和段數(shù)據(jù)。但是,一旦器件掉電并重新上電,而且允許獨(dú)立運(yùn)行(沒有連接調(diào)試器),在每次運(yùn)行前MAX-IDE將無法正確裝載數(shù)據(jù)段。變量也無法設(shè)置在所要求的數(shù)值,導(dǎo)致應(yīng)用程序不能正確執(zhí)行。這種故障很難分析,因?yàn)橐坏┢骷匦逻B接到調(diào)試器,MAX-IDE將在每次運(yùn)行前重新開始裝載數(shù)據(jù)段,問題也就消失了。
保存和恢復(fù)數(shù)據(jù)段
一個(gè)遺留問題是:如何使應(yīng)用程序在連接調(diào)試器(每次運(yùn)行前MAX-IDE重新裝載程序和數(shù)據(jù))和獨(dú)立運(yùn)行(上電后RAM內(nèi)容不確定)時(shí)都能保持工作。顯然,解決方法需要兩個(gè)步驟:應(yīng)用程序?qū)⒆兞恐?一旦經(jīng)過初始化)保存到閃存,每次復(fù)位或上電后重新裝載這些數(shù)值。
對(duì)于第一步,應(yīng)用程序必須將數(shù)值保存到閃存。每次主機(jī)擦除或裝載程序后第一次運(yùn)行應(yīng)用程序時(shí)執(zhí)行該操作。
應(yīng)用程序檢測(cè)“標(biāo)志”位置以驗(yàn)證變量之前是否復(fù)制到閃存內(nèi)。該標(biāo)志可以存儲(chǔ)在特殊功能、非易失存儲(chǔ)器,或與變量共用存儲(chǔ)器,只要變量具有非零初始值(與空RAM地址區(qū)分開)。
應(yīng)用程序?qū)⒚總€(gè)變量值從數(shù)據(jù)RAM復(fù)制到閃存,絕大多數(shù)帶有可重復(fù)寫操作閃存的MAXQ微控制器(如MAXQ2000)利用UROM_flashWrite函數(shù)實(shí)現(xiàn)。
應(yīng)用程序在閃存中寫一個(gè)標(biāo)志,表明已經(jīng)存儲(chǔ)變量。
對(duì)于第二步,在后續(xù)的程序運(yùn)行中,應(yīng)用程序必須將變量從閃存重新裝載到預(yù)先規(guī)定的數(shù)據(jù)RAM地址。
應(yīng)用程序檢測(cè)閃存的標(biāo)志位置,以驗(yàn)證已經(jīng)存儲(chǔ)變量。
應(yīng)用程序利用UROM_copyBuffer子程序?qū)⒆兞繌拈W存復(fù)制到數(shù)據(jù)RAM的正確位置。
以下程序清單展示了利用MAXQ2000評(píng)估板的保存-恢復(fù)方案,該程序中,變量值存儲(chǔ)在閃存的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
評(píng)論