王卡風(fēng) 馮顯桂 湯 彬 王仁波
(1、東華理工大學(xué)信息工程學(xué)院,江西 撫州 3440002、深圳市五巨科技有限公司工程師,廣東 深圳 5180003、東華理工大學(xué),江西 撫州 344000)
MTK平臺的內(nèi)存由RAM和flash memory構(gòu)成,其中RAM用來存儲讀寫數(shù)據(jù),flash memory用來存儲只讀數(shù)據(jù)和文件目錄,對于不同的平臺,flash memory又有不同的分類,通常采用nor flash,也有的采用nand flash。通常情況下,MT6225平臺默認(rèn)的ram和flash memory大小分別為4M和16M,也有少數(shù)采用8M和 32M,如08A、0812,對于16M的flash memory來說,有2M被用于NVRAM來存儲文件系統(tǒng),因此真正用于系統(tǒng)的只剩下14M。
MTK對內(nèi)存的分布實行分段分塊來處理,其結(jié)構(gòu)如下圖1所示。
MTK以其技術(shù)門檻和成本低贏得了很大的市場,對于MTK手機(jī)方案商來說,為節(jié)約其成本,通常其內(nèi)存都不是很大,因此要在小內(nèi)存上作出各種各樣的多功能手機(jī),顯然對于內(nèi)存使用來說無疑是個障礙,因此MTK提供了內(nèi)存復(fù)用技術(shù)來解決這個問題。
MTK平臺內(nèi)存復(fù)用是對已分配的內(nèi)存重新使用,動態(tài)內(nèi)存分配均是對已分配內(nèi)存的復(fù)用。
在遇到內(nèi)存的ram緊張時,不一定非要采用增加RAM來實現(xiàn),這樣成本較大,可以采用復(fù)用內(nèi)存也可以節(jié)約大量內(nèi)存。在SCAT文件中,很多時候,我們可以看到關(guān)健字overlay,這是一些手機(jī)的應(yīng)用中為節(jié)省內(nèi)存使用的復(fù)合內(nèi)存,如INTSRAM_MULTIMEDIA 0x400000000xC000,聲明了MED復(fù)用內(nèi)存的起始地址,只要不沖突,這幾乎是最好的解決內(nèi)存緊張的方法。如果RAM編繹到最后出錯,提示RAM超過了,這時就要精確計算超出部分的大小,然后再根據(jù)計算的大小尋找解決辦法。計算的方法是打開LIS文件,把RAM或者ROM加起來,減去14或者4,超過的字節(jié)數(shù),就是需要調(diào)整的內(nèi)存大小。
內(nèi)存復(fù)用其實采用的就是在不同時刻讓不同的程序使用同一塊內(nèi)存,其原理和通信中的時分復(fù)用(TDM)原理相類似,因此只要我們對申請的內(nèi)存進(jìn)行統(tǒng)一的管理,讓其在特定的時候占有,并在另一特定的時候釋放,這樣便可以實現(xiàn)內(nèi)存復(fù)用,解決內(nèi)存資源不足,其復(fù)用原理如圖2所示。
MTK平臺的內(nèi)存使用有三個模式:靜態(tài)模式、靜態(tài)+動態(tài)模式、動態(tài)模式。
1)靜態(tài)模式
對于靜態(tài)模式來說,它不使用內(nèi)存的動態(tài)分配,而采用一系列的全局變量和數(shù)組來占用系統(tǒng)剩余內(nèi)存,因此不需要考慮對資源的申請和銷毀,但是對系統(tǒng)內(nèi)存的使用較大。一般來說,在現(xiàn)在的MTK基線版本中,系統(tǒng)空閑的內(nèi)存在100K左右,到方案商出貨時,添加了其他應(yīng)用,此時的內(nèi)存剩余量,在20K~30K左右。程序移植時,空間問題難以解決。除此之外,程序模塊之間的耦合性高,可維護(hù)和擴(kuò)充性差。
2)靜態(tài)+動態(tài)模式。
使用各種復(fù)用方法先為整個程序獲取一大塊內(nèi)存,然后去管理這段內(nèi)存。但是沒有有效的內(nèi)存管理方法,一般用用指針的方式將整個程序中使用到的零零碎碎的內(nèi)存放到其中去,過于零碎的內(nèi)存,當(dāng)然沒有放到這段內(nèi)存中了,依然會占用一些系統(tǒng)的剩余內(nèi)存。此方法相比于靜態(tài)的方式,內(nèi)存占用小多了。
3)動態(tài)模式
對于第二種模式來說,雖說其占用的內(nèi)存少了,但是由于缺少有效的內(nèi)存管理方法,程序員需要花很多精力來對內(nèi)存進(jìn)行管理,而他們希望盡量使用同一種方法來動態(tài)管理內(nèi)存,就像在PC平臺上使用malloc一樣簡單。顯然上面的模式不是解決內(nèi)存復(fù)用的最佳方式。那么為了使編程人員從內(nèi)存使用的困擾中解脫出來,MTK提供了幾套動態(tài)的內(nèi)存管理機(jī)制,程序員只需從內(nèi)存中獲取一塊內(nèi)存,然后采用MTK提供的管理方法來使用這塊內(nèi)存,這樣既給程序員減少了內(nèi)存使用的負(fù)擔(dān),又可以實現(xiàn)內(nèi)存復(fù)用,其動態(tài)模式如圖5所示。
總結(jié)上面三者的優(yōu)缺點見表
?
[1]KAL_ProgrammingGuide Media Tek[Z].20041005
[2]SystemServiceUserManualMedia Tek[Z].20041021
[3]Create_Primitive_Message_UserManualMedia Tek[Z].20040909
[4]ARM體系結(jié)構(gòu)與編程,杜春雷,清華大學(xué)出版社 200302