關(guān)于MTK啟動(dòng)過程詳解
關(guān)于MTK啟動(dòng)過程詳解是本文要介紹的內(nèi)容,主要是來了解MTK在啟動(dòng)過程中的一些原理。MT6305上電給基帶芯片供電,在一定時(shí)序條件后,給基帶芯片復(fù)位信號(hào),開始了ARM核的啟動(dòng)過程。要談啟動(dòng),我們必須熟悉Scatterfile、基帶資料的Memorymapping章節(jié)。Scatterfile定義了loadregion和excecuteregion,我們要關(guān)心系統(tǒng)運(yùn)行時(shí)代碼、數(shù)據(jù)的地址分布。
Bootarm.s是一個(gè)重要的文件,與啟動(dòng)過程有關(guān),其中的INT_Initialize函數(shù)是ARM啟動(dòng)開始執(zhí)行的代碼。BSP所做的事情主要包括:
1、配置PLL,配置基帶芯片的EMI參數(shù),以讓系統(tǒng)能夠以最大的速度讀取外部存儲(chǔ)設(shè)備數(shù)據(jù),讓CPU以最大速度運(yùn)行,從而縮短啟動(dòng)過程。
2、做好runtime代碼及數(shù)據(jù)的準(zhǔn)備,確保excecuteregion的代碼及數(shù)據(jù)到位。
3、配置好ARM七種異常模式的堆棧,進(jìn)入RTOSnucleus的初始化。
4、nucleus留給客戶的初始化函數(shù)Application_Initialize,做了平臺(tái)該做的初始化工作,比如外部控制器的初始化等等。
RTOS
在分析系統(tǒng)問題,開發(fā)跨線程應(yīng)用時(shí),必須熟悉RTOS。目前使用的RTOS是nucleus,盡管在BSP中看到了它對(duì)ThreadX的支持。不同的RTOS,實(shí)際上也是大同小異,但是具體的API或者參數(shù)會(huì)有不同,因此我們需要下載nucleus的API文檔,在需要了解細(xì)節(jié)時(shí),可以翻閱此文檔。同時(shí),TRACE32支持基于RTOS級(jí)別的調(diào)試,因此對(duì)RTOS的了解,有助于提高調(diào)試能力。
有點(diǎn)特殊的是,nucleus有LISR,HISR的概念,實(shí)際上它是一種給開發(fā)者的印象。它告訴開發(fā)者,中斷處理函數(shù)LISR要盡量的耗時(shí)短,以確保其它中斷能有機(jī)會(huì)及時(shí)響應(yīng)。HISR再處理略為次要些的工作,但耗時(shí)也不能太長,因?yàn)镠ISR比任何TASK的優(yōu)先級(jí)都高,我們應(yīng)該讓真正需要實(shí)時(shí)的工作獲取CPU的機(jī)會(huì)。
Application_Initialize中的mainp函數(shù),負(fù)責(zé)任務(wù)的創(chuàng)建。我們?cè)诖a中見不到任務(wù)創(chuàng)建的函數(shù),只需要維護(hù)任務(wù)初始化參數(shù)數(shù)據(jù)結(jié)構(gòu)。對(duì)于系統(tǒng)的那些task信息,都保存在sys_comp_config_tbl變量中,我們看不到。但是MTK提供給客戶的custom_comp_config_tbl,客戶是可以修改的,在這里用戶可以定義自己的task。
關(guān)于任務(wù),需要關(guān)心數(shù)據(jù)結(jié)構(gòu)comptask_handler_struct。關(guān)于comptask_handler_struct成員的執(zhí)行順序,應(yīng)該是:comp_init_func在系統(tǒng)還未schedule即在Application_Initialize中完成,然后taskschedule后執(zhí)行comp_entry_func。comp_cfg_func、comp_reset_func、comp_end_func我認(rèn)為無太多意義。
task和module有什么區(qū)別?可以肯定的是,task是操作系統(tǒng)層面的概念,module是軟件平臺(tái)設(shè)計(jì)者因?yàn)槟撤N需要而設(shè)計(jì)的,可能大家比我更清楚,但這種概念在具體工作中可能還是需要弄清楚。
到此,基于RTOS的各個(gè)TASK應(yīng)該都已經(jīng)調(diào)度起來。首先毫無疑問,idletask必須是優(yōu)先級(jí)最低的task。按照常理,系統(tǒng)會(huì)從最高優(yōu)先級(jí)的任務(wù)開始調(diào)度,至于如何跑到MMI顯示LOGO界面,在必要時(shí),我們可以去研究。
GUI機(jī)制
至于MMIframewok,我未做太多了解,但任何GUI系統(tǒng)面對(duì)的都是最終的LCDbufffer。但不同的是,MTK的基帶芯片搞了個(gè)LCD控制器,并加了layer的概念,從硬件上支持2Dfunction和加速LCD的刷屏。對(duì)于上層的GUI,要做的是選擇哪個(gè)layer是active。
LCD控制器的刷屏機(jī)制。以6225為例,支持4layer。MTK資料對(duì)LCD控制器未做詳細(xì)的描述,是其對(duì)LCD接口塊圖的描述。但通過LCD控制器驅(qū)動(dòng),我們可以對(duì)LCD控制器內(nèi)部結(jié)構(gòu)做更多的假設(shè)。圖1中的Overlay,我們可以設(shè)想為一個(gè)專有的DMA控制器通道,目標(biāo)地址為LCD,源地址是layerbuffer。系統(tǒng)通過配置要刷哪幾層,配置alpha值來控制2D效果。這一目的的達(dá)到,硬件上有它的考慮,我們也沒有必要做太多確定性的假想。
需要說明的是,僅僅是這樣一張圖,我們應(yīng)該有更多的聯(lián)想。Layerbuffer都是從外部RAM開辟的內(nèi)存空間,LCD的訪問時(shí)序完全決定于如何配置LCD控制器。對(duì)Layerbuffer的讀寫,需要占用系統(tǒng)總線,即使再做總線上的區(qū)域規(guī)劃,外部RAM的數(shù)據(jù)總線是公共資源。對(duì)公共資源的訪問,就意味著并發(fā),意味著仲裁ARBITER。為什么在以前的項(xiàng)目中,出現(xiàn)一些關(guān)于LCD的莫名其妙的問題,不能說這里是根本原因,但我們應(yīng)該從系統(tǒng)的角度去注意到這點(diǎn)。我對(duì)資源的占有,就意味著別人的失去。以往被掩蓋的缺陷,可能會(huì)因?yàn)橄到y(tǒng)運(yùn)行時(shí)的變化,暴露出來。這就是我認(rèn)為,有些系統(tǒng)問題,不能從代碼表面去分析,而要從ARM核的角度,從同cache,BUS,controller等外圍設(shè)備之間的聯(lián)系來系統(tǒng)的分析問題。
關(guān)注一下開機(jī)LOGO的顯示,是在uem_poweron_timer_expiry_hdlr函數(shù)中,同時(shí)這里做了latchpower的動(dòng)作。還有潛力,提前顯示出LOGO。
內(nèi)存分配機(jī)制
在MTK的資料中,介紹了它的內(nèi)存管理機(jī)制,有3種:ADM、Controlbuffer、SystemMemory。后兩個(gè)是系統(tǒng)使用的,與上層應(yīng)用無關(guān)。但是我對(duì)kal_system_alloc也做了初步分析。
sys_mem_ptr,其估計(jì)應(yīng)該指向的是System_Mem_Pool,debug_mem_ptr,其估計(jì)應(yīng)該指向的是debug_Mem_Pool。經(jīng)過初步分析,kal_system_alloc就是從System_Mem_Pool做簡單的加法操作,sys_mem_left_size就是System_Mem_Pool還剩下多少。kal_system_alloc從sys_mem_ptr開始來計(jì)算要取的內(nèi)存。ctrl_buf是通過kal_system_alloc的內(nèi)存,然后再通過NU_Create_Partition_Pool創(chuàng)建POOL。系統(tǒng)的一些taskstack.等也都是通過kal_system_alloc來分配的。
也就是說,Controlbuffer、SystemMemory用的都是System_Mem_Pool的空間。而System_Mem_Pool可以查到,是在custom_configmem函數(shù)中配置。
ADM就完全沒有使用操作系統(tǒng)提供的內(nèi)存管理算法,是平臺(tái)自創(chuàng)了一套。開發(fā)者,可以自己開辟一個(gè)POOL,自己在這個(gè)池用ADM提供的內(nèi)存管理API完成內(nèi)存的動(dòng)態(tài)管理。具體的分配算法,就沒有再細(xì)看,跟一些通用的內(nèi)存分配算法應(yīng)該一致。但是在以前調(diào)試一個(gè)問題的時(shí)候,應(yīng)該是可以斷定,ADM在每一個(gè)allocnode前后都加了GAP調(diào)試區(qū),來判斷是否被overwrite。
至于系統(tǒng)中,到底是用了多少塊內(nèi)存用于ADM,各塊內(nèi)存又是讓哪些應(yīng)用在共享,開發(fā)者可能更清楚。在系統(tǒng)中是否建立了對(duì)內(nèi)存動(dòng)態(tài)分配的監(jiān)控機(jī)制,比如查詢內(nèi)存泄漏、動(dòng)態(tài)內(nèi)存使用效率等等。
文件系統(tǒng)
文件系統(tǒng)用的是FAT格式,最關(guān)鍵的是如何MOUNT存儲(chǔ)設(shè)備,如何匹配文件系統(tǒng)讀寫接口。MTK通過表格的形式來讓客戶選擇支持的flash,真的是很方便,考慮太周到。
編譯機(jī)制
MTK的makefile,寫的很復(fù)雜,有perl腳本,也有make腳本,但框架結(jié)構(gòu)很好。雖然我對(duì)makefile結(jié)構(gòu)通讀了一遍,但沒有仔細(xì)花時(shí)間對(duì)此形成文檔。
方案印象
MTK軟件平臺(tái),接觸了一年,總體感覺其底層代碼寫的很工整,結(jié)構(gòu)很清晰。越到上層,代碼就顯的龐大凌亂,結(jié)構(gòu)性和可讀性都不強(qiáng)。如果把芯片設(shè)計(jì)也說上,我覺得MTK的基帶芯片設(shè)計(jì)很智慧,針對(duì)特定的多媒體手機(jī)應(yīng)用,設(shè)計(jì)出專門的控制器嵌入芯片內(nèi)部。像uart控制virtrualfifo和camera的resizer以及l(fā)cdcontroller,用低成本控制器來快速完成邏輯,從而減輕CPU的負(fù)擔(dān),提高芯片的整體性能。在其他多媒體處理器中,都是不多見的。
與業(yè)界認(rèn)為從事MTK平臺(tái)開發(fā)的技術(shù)含量低恰恰相反,我認(rèn)為MTK方案技術(shù)含量非常高。MTK軟件平臺(tái)的代碼開放程度也不低,MTK的技術(shù)支持也非常有力而迅速,以MTK平臺(tái)為基礎(chǔ)的終端承載了最豐富多樣的應(yīng)用。MTK方案給希望對(duì)手機(jī)平臺(tái)有深入而全面了解的同事提供了機(jī)會(huì)。
基于MTK平臺(tái)的產(chǎn)品開發(fā)
有那么多的公司在做基于MTK平臺(tái)的產(chǎn)品,競(jìng)爭那么激烈,研發(fā)上如何在競(jìng)爭中體現(xiàn)優(yōu)勢(shì)?硬件上,大家都一樣。軟件上,也是一樣。你可以有,別人也可以有或者偷,別人可以有,我們也可以有或者偷。最多是差個(gè)把月,怎么辦。一個(gè)中心兩個(gè)基本點(diǎn)。以服務(wù)好客戶為中心,保證兩個(gè)基本點(diǎn),一是要快,二是差異。
拉不到客戶什么就不要做了。在大家都差不多的情況下,我們以客戶為中心,快速的滿足客戶需求,提供產(chǎn)品。這樣能拉住客戶,讓客戶找不到離開的理由。第二是產(chǎn)品差異,是創(chuàng)新。如果有產(chǎn)品創(chuàng)新最好,要么降低了成本,要么吸引了消費(fèi)者。但這兩點(diǎn)中,還是快字最重要,這是可以通過團(tuán)隊(duì)專業(yè)實(shí)力和激情來保證的。但是創(chuàng)新,有運(yùn)氣的成分,需要研發(fā)同市場(chǎng)碰撞出火花。鼓勵(lì)和激勵(lì)創(chuàng)新,但不能只靠產(chǎn)品創(chuàng)新一定會(huì)出現(xiàn)。
小結(jié):
關(guān)于MTK啟動(dòng)過程詳解的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!