版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 賈平凹《秦腔》課件
- 2026年橋梁健康評(píng)估與風(fēng)險(xiǎn)管理
- 2026年橡膠支座在抗震設(shè)計(jì)中的應(yīng)用
- 貨運(yùn)駕駛員汛期安全培訓(xùn)課件
- 貨運(yùn)安全教育培訓(xùn)計(jì)劃課件
- 醫(yī)療行業(yè)人工智能應(yīng)用案例分析
- 生育健康服務(wù)項(xiàng)目總結(jié)
- 護(hù)理學(xué)科研究與創(chuàng)新能力提升
- 醫(yī)療機(jī)構(gòu)禮儀與醫(yī)療法規(guī)
- 2026年東營科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題有答案解析
- GB/T 45953-2025供應(yīng)鏈安全管理體系規(guī)范
- 2025秋季學(xué)期國開電大法律事務(wù)專科《刑事訴訟法學(xué)》期末紙質(zhì)考試簡答題庫2025春期版
- 要素式民事起訴狀(房屋租賃合同糾紛)
- 設(shè)計(jì)公司報(bào)賬管理辦法
- DB51∕T 3045-2023 四川省社會(huì)保險(xiǎn)基本公共服務(wù)規(guī)范
- 畢業(yè)設(shè)計(jì)(論文)-自動(dòng)展開曬衣架設(shè)計(jì)
- 智能化系統(tǒng)在鐵路裝備檢修中的應(yīng)用-洞察闡釋
- TCPQSXF006-2023消防水帶產(chǎn)品維護(hù)更換及售后服務(wù)
- 邊坡噴錨施工方案
- YS/T 3045-2022埋管滴淋堆浸提金技術(shù)規(guī)范
- 項(xiàng)目進(jìn)度跟進(jìn)及完成情況匯報(bào)總結(jié)報(bào)告
評(píng)論
0/150
提交評(píng)論