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