空間數(shù)據(jù)采樣方案設(shè)計(jì)_第1頁
空間數(shù)據(jù)采樣方案設(shè)計(jì)_第2頁
空間數(shù)據(jù)采樣方案設(shè)計(jì)_第3頁
空間數(shù)據(jù)采樣方案設(shè)計(jì)_第4頁
空間數(shù)據(jù)采樣方案設(shè)計(jì)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——空間數(shù)據(jù)采樣方案設(shè)計(jì)數(shù)據(jù)管理方案設(shè)計(jì)生動(dòng)MEMORY

本文針對(duì)大量儀器需要預(yù)置數(shù)據(jù)于FLASH芯片的處境,提出了一種將FLASH操作從數(shù)據(jù)管理類中剝離,從而使FLASHMEMORY數(shù)據(jù)管理變得更加簡便、生動(dòng)及易于使用的有效解決方案。

閃存;數(shù)據(jù)管理

AnDesignonanFlexibleFlashMemoryDataManagement

WangQing-shan

(HainanUniversityHainanHaikou570208)

Nowadays,moreandmoreequipmentsusingFlashMemorytostorepre-setdataandparameters.ThisdesignseparatesFlashdataoperationsfromtheManagementclass,makingtheflashmemorydataeasierandmoreflexibletomanageanduse.

flashmemory;datamanagement

1問題的提出

大量重要的儀器,如醫(yī)學(xué)儀器,全部預(yù)置數(shù)據(jù)均存儲(chǔ)在一片F(xiàn)lashMemory的若干扇區(qū)上,根據(jù)用途這些預(yù)置數(shù)據(jù)分為通用參數(shù)、各檢查模式參數(shù)、TGC曲線、后處理參數(shù)、解釋用語庫以及穿刺參數(shù)等,系統(tǒng)運(yùn)行時(shí),這些數(shù)據(jù)被分別載入系統(tǒng)內(nèi)的對(duì)應(yīng)的預(yù)置數(shù)據(jù)管理對(duì)象,供系統(tǒng)使用,同時(shí)這些數(shù)據(jù)也可以由其對(duì)應(yīng)的預(yù)置數(shù)據(jù)管理對(duì)象寫入FlashMemory。

提出一個(gè)解決方案并不困難,但我們夢想能實(shí)現(xiàn)一個(gè)合理、生動(dòng)、易于使用的解決方案:

1)預(yù)置數(shù)據(jù)根據(jù)其對(duì)應(yīng)的預(yù)置數(shù)據(jù)管理對(duì)象來組織,其讀寫由預(yù)置數(shù)據(jù)管理對(duì)象實(shí)現(xiàn);

2)多個(gè)預(yù)置數(shù)據(jù)管理對(duì)象管理的數(shù)據(jù)可以存放在同一扇區(qū),以提高FlashMemory的存儲(chǔ)效率;

3)各預(yù)置數(shù)據(jù)管理對(duì)象可以單獨(dú)寫入數(shù)據(jù),由于FlashMemory的讀寫特性,同一扇區(qū)的其它數(shù)據(jù)也要同時(shí)寫入;

4)輕易增加新的預(yù)置數(shù)據(jù)及其管理對(duì)象;

5)使用方法簡易、明顯,最好能以流的方式讀寫數(shù)據(jù);

6)輕易支持多廠商的FLASH芯片。

2實(shí)現(xiàn)方案

數(shù)據(jù)由預(yù)置數(shù)據(jù)管理對(duì)象管理,問題在于FLASHMEMORY的讀寫理應(yīng)由誰實(shí)現(xiàn)。較早的方案是數(shù)據(jù)管理對(duì)象自行讀寫FLASHMEMORY,為此,全體的數(shù)據(jù)管理類都繼承了一個(gè)具備讀、寫、擦除FLASHMEMORY才能的類FlashManager。鑒于FLASHMEMORY的讀寫特性,在將多個(gè)預(yù)置數(shù)據(jù)管理對(duì)象管理的數(shù)據(jù)存放于同一扇區(qū)時(shí),采用這種方案會(huì)遇到困難,由于每個(gè)數(shù)據(jù)管理對(duì)象在將數(shù)據(jù)寫入FLASHMEMORY之前,都要先擦除將要寫入的扇區(qū)。

解決問題的方法是,將讀寫FLASHMEMORY的功能從數(shù)據(jù)管理類中剝離出來,由一個(gè)單獨(dú)的對(duì)象完成。

類關(guān)系圖如圖1所示。

DataManagerBase是純虛類,它定義了數(shù)據(jù)管理類的接口片面:

classDataManagerBase:publicUObject

{

protected:

shortmSector;//數(shù)據(jù)存儲(chǔ)在FLASHMEMORY中的扇區(qū)號(hào)

shortmOffset;//存儲(chǔ)的起始位置相對(duì)于扇區(qū)首地址的偏移量

public:

DataManagerBase(…);//構(gòu)造函數(shù),略

virtualvoidReadData()=0;//將數(shù)據(jù)從FLASH讀入,將由派生類重載

virtualvoidWriteData();

virtualvoidDoWriteData(FlashManager*the_flash)=0;

//將數(shù)據(jù)寫入FLASH,將由派生類重載

};

UObject是供給對(duì)象管理根本特性的根類,如對(duì)象分層管理、對(duì)象遍歷、對(duì)象識(shí)別、收發(fā)消息等才能,在此不作議論。

WriteData()是將數(shù)據(jù)寫入FLASHMEMORY的接口函數(shù),但它實(shí)際上并未執(zhí)行將數(shù)據(jù)寫入FLASH操作,它只是通知父對(duì)象刷新它所在的扇區(qū),實(shí)際的數(shù)據(jù)寫入工作是由DoWriteData(FlashManager*the_flash)函數(shù)完成的,該函數(shù)通過the_flash所指的FlashManager對(duì)象將自己管理的數(shù)據(jù)寫入FLASH。

ReadData和DoWriteData負(fù)責(zé)完成讀寫FlashManager所管理數(shù)據(jù)的工作,它們的實(shí)現(xiàn)代碼將在派生類中定義。

FlashManager類封裝了對(duì)FLASH的操作,而PresetServer類是個(gè)操縱類,它擁有全體的預(yù)置數(shù)據(jù)管理對(duì)象(圖2例如中的d1和d2,實(shí)際上預(yù)置數(shù)據(jù)管理對(duì)象的個(gè)數(shù)沒有限制)和一個(gè)由m_pTheFlash指向的FlashManager對(duì)象,該FlashManager對(duì)象負(fù)責(zé)完成全體對(duì)FLASH的實(shí)際操作。

單獨(dú)地將一個(gè)數(shù)據(jù)管理對(duì)象(d1:Data1Manager)的數(shù)據(jù)寫入FLASH的時(shí)序如圖3所示。

1)d1:Data1Manager收到將數(shù)據(jù)寫入FLASH的消息;

2)d1:Data1Manager向thePresetServer苦求刷新本扇區(qū)(mSector);

3)thePresetServer將*m-pTheFlash的扇區(qū)設(shè)置為將要刷新的扇區(qū);

4)調(diào)用*m_pTheFlash函數(shù)擦除該扇區(qū);

5)遍歷并將m_pTheFlash對(duì)象指針傳給全體的DataManager對(duì)象(包括發(fā)出苦求的d1:Data1Manager對(duì)象),使扇區(qū)號(hào)與指定扇區(qū)號(hào)相符的數(shù)據(jù)管理對(duì)象將自身數(shù)據(jù)寫入FLASH。

代碼如下:

//假設(shè)obj是DataManager對(duì)象,那么obj通過p_flash所指的FlashManager對(duì)象

//將自己所管理的數(shù)據(jù)寫入FLASH

//p_flash:FlashManager指針

staticvoidDoWriteDataTo(UObject

}

voidDataManagerBase::WriteData()

{

//苦求刷新mSector扇區(qū)

RequestToParent(Req_WriteDataInSector,0,mSector);

}

//處理子對(duì)象發(fā)來的苦求

voidPresetServer::HandleChildRequest(UChildMessage*p_req)

{

if(p_req->NotifyCode==Req_WriteDataInSector)//假設(shè)是刷新扇區(qū)的苦求{

//將FlashManager的扇區(qū)設(shè)置為將要刷新的扇區(qū)

m_pTheFlash->SetSectorNum(p_req->LParam);

//擦除該扇區(qū)

m_pTheFlash->EraseSector();

//遍歷全體的DataManager子對(duì)象,使扇區(qū)號(hào)與指定扇區(qū)號(hào)相符的數(shù)據(jù)管理對(duì)象

//用m_pTheFlash所指的FlashManager對(duì)象將自身數(shù)據(jù)寫入FLASH

ForEach(DoWriteDataTo,(void*)m_pTheFlash);

}

…//處理其它苦求

}

voidData1Manager::DoWriteData(UFlashManager*the_flash)

{

//假設(shè)不是操作自身數(shù)據(jù)所在扇區(qū),返回

if(the_flash->SectorNum()!=mSector)

return;

//將數(shù)據(jù)寫入FLASH

the_flash->WriteData(地址偏移1,數(shù)據(jù)1);

the_flash->WriteData(地址偏移2,數(shù)據(jù)2);

}

相對(duì)于寫數(shù)據(jù),DataManager從FLASH中讀出數(shù)據(jù)簡樸一些,DataManager只須從PresetServer處得到FlashManager對(duì)象指針,然后按地址偏移將數(shù)據(jù)讀出即可。

3議論

以上方案實(shí)現(xiàn)了數(shù)據(jù)管理對(duì)象(DataManager)與數(shù)據(jù)操作對(duì)象(FlashManager)的動(dòng)態(tài)綁定,經(jīng)過進(jìn)一步分析,察覺這實(shí)際上是bridge設(shè)計(jì)模式的變型。這是說明組合關(guān)系比繼承關(guān)系更為生動(dòng)的又一個(gè)例子。

我們的啟程點(diǎn)是制止數(shù)據(jù)管理對(duì)象在寫FLASH之前擦除目標(biāo)扇區(qū),為此將FLASH操作從數(shù)據(jù)管理類中剝離出來,形成獨(dú)立的FlashManager類,現(xiàn)在這種生動(dòng)性帶來了其它好處:

1)DataManager和FlashManager可以彼此獨(dú)立地變化,我們可以獨(dú)立地?cái)U(kuò)展DataManager和FlashManager的類層次布局。

2)DataManager對(duì)象和FlashManager對(duì)象可以動(dòng)態(tài)組合,DataManager甚至可以在程序運(yùn)行時(shí)選擇其它的FlashManager(例如支持其它公司的FLASH芯片)。當(dāng)然在線切換FLASH型號(hào)沒什么必要,但在其它場合這種切換是有用的,如醫(yī)學(xué)儀器的中英文版動(dòng)態(tài)切換、檢查模式參數(shù)動(dòng)態(tài)切換就是用bridge模式實(shí)現(xiàn)的。

3)FlashManager有可能被設(shè)計(jì)為通用的FLASH操作類,支持多種FLASH,也可以用于只要需要操作FLASH的場合。

4)FlashManager與DataManager的分開使得FlashManager采用流的方式讀寫數(shù)據(jù)成為可能,DataManager不必再打理每個(gè)數(shù)據(jù)在FLASH扇區(qū)中的偏移地址,它只需以固定的依次將自己管理的數(shù)據(jù)流入數(shù)據(jù)管理大為簡化,代碼干脆明顯。

4以流的方式工作

要使FlashManager能以流的方式工作,首先定義與流有關(guān)的函數(shù),重載流運(yùn)算符:

classFlashManager

{

shortmSectorNum;//扇區(qū)號(hào)

short*ChipBaseAddr;//FLASH基地址

short*SectorBaseAddr;//扇區(qū)基地址

intmOffsetInWord;//偏移量

intmStreamPosi;//流位置

public:

//構(gòu)造函數(shù)與析構(gòu)函數(shù),略

//流函數(shù)

voidMoveTo(intstream_posi);//移到流的指定位置

FlashManager

FlashManager

FlashManager

FlashManager

//…其它需要流出的數(shù)據(jù)類型

private:

shortReadWord(longrAddr)

floatReadFloat(longrAddr);

boolWriteWord(longrAddr,shortsData);

voidWriteFloat(longrAddr,floatfData);

};

重載什么數(shù)據(jù)類型的流運(yùn)算符取決于DataManager管理的數(shù)據(jù)類型有多少。

//將一個(gè)char數(shù)據(jù)寫入FLASH

FlashManager//從FLASH流指針指定位置讀出數(shù)據(jù)

mStreamPosi++;//流指針加1

return*this;

};

流操作符返回FlashManager對(duì)象引用的目的在于能以連續(xù)調(diào)用的格式書寫代碼:

//以下為偽代碼

//Data1Manager從FLASH讀入數(shù)據(jù)

voidData1Manager::ReadData()

{

//獲取FlashManager對(duì)象指針

FlashManager*p_flash=(FlashManager*)RequestToParent(Req_PresetFlashPtr,mSector,

mOffsetInWord);

//移到流的起始位置;

p_flash->MoveTo(0);

//數(shù)據(jù)從FlashManager流出(從FLASH讀),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論