資源描述:
《mtk內(nèi)存、任務(wù)管理和定時器消息機制 轉(zhuǎn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、MTK內(nèi)存、任務(wù)管理和定時器消息機制轉(zhuǎn)MTK內(nèi)存、任務(wù)管理和定時器消息機制(轉(zhuǎn))2010年11月16日15:401內(nèi)存管理。平臺不提供動態(tài)分配內(nèi)存的方式;應(yīng)用程序需要使用動態(tài)分配內(nèi)存時,可以采用以下幾種方式:與系統(tǒng)其他模塊共享內(nèi)存,典型的是使用MED模塊的內(nèi)存;定義一個靜態(tài)數(shù)組,交給系統(tǒng)adm托管,然后調(diào)用kal_adm_alloc、kal_adm_free等內(nèi)存操作函數(shù)實現(xiàn)動態(tài)內(nèi)存分配;定義一個靜態(tài)數(shù)組,應(yīng)用自己實現(xiàn)基于此數(shù)組的分配和管理,也就是實現(xiàn)自己的內(nèi)存管理模塊。在MTK的資料中,介紹了它的內(nèi)存管理機制,有3種:ADM、Controlbuffer、S
2、ystemMemory。后兩個是系統(tǒng)使用的,與上層應(yīng)用無關(guān)。但是我對kal_system_alloc也做了初步分析。sys_mem_ptr,其估計應(yīng)該指向的是System_Mem_Pool,debug_mem_ptr,其估計應(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開始來計算要取的內(nèi)存。ctrl_buf是通過kal_syste
3、m_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)存管理算法,是平臺自創(chuàng)了一套。開發(fā)者,可以自己開辟一個POOL,自己在這個池用ADM提供的內(nèi)存管理API完成內(nèi)存的動態(tài)管理。具體的分配算法,就沒有再細看
4、,跟一些通用的內(nèi)存分配算法應(yīng)該一致。但是在以前調(diào)試一個問題的時候,應(yīng)該是可以斷定,ADM在每一個allocnode前后都加了GAP調(diào)試區(qū),來判斷是否被overwrite。至于系統(tǒng)中,到底是用了多少塊內(nèi)存用于ADM,各塊內(nèi)存又是讓哪些應(yīng)用在共享,開發(fā)者可能更清楚。在系統(tǒng)中是否建立了對內(nèi)存動態(tài)分配的監(jiān)控機制,比如查詢內(nèi)存泄漏、動態(tài)內(nèi)存使用效率等等。3少于2K使用get_ctrl_buffer。大于2K使用admget_ctrl_buffer是在系統(tǒng)定義的一塊區(qū)域申請空間。這段空間被分為好多塊均等大小。好像有以下幾種方式:2個1K*24個0.5K*46個0.25K
5、*8申請的話,按首適應(yīng)算法。這就是你所說的小塊內(nèi)存管理。adm主要是你自己定義的一塊全局數(shù)組比如400K.你可以使用它的adm相關(guān)函數(shù)去動態(tài)申請釋放這400K大小的區(qū)域,維護也靠你自己。2.任務(wù)管理任務(wù)管理。系統(tǒng)任務(wù)采用靜態(tài)創(chuàng)建方式,靜態(tài)配置任務(wù)優(yōu)先級、棧大小、任務(wù)全局唯一ID等;不提供動態(tài)創(chuàng)建Task的方式;任務(wù)內(nèi)部以及任務(wù)之間的通信通過內(nèi)部事件隊列和外部事件隊列完成Application_Initialize中的mainp函數(shù),負責任務(wù)的創(chuàng)建。我們在代碼中見不到任務(wù)創(chuàng)建的函數(shù),只需要維護任務(wù)初始化參數(shù)數(shù)據(jù)結(jié)構(gòu)。對于系統(tǒng)的那些task信息,都保存在sys_
6、comp_config_tbl變量中,我們看不到。但是MTK提供給客戶的custom_comp_config_tbl,客戶是可以修改的,在這里用戶可以定義自己的task。關(guān)于任務(wù),需要關(guān)心數(shù)據(jù)結(jié)構(gòu)comptask_handler_structcomptask_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
7、_func我認為無太多意義。MTK6235Custom_config.h中對于添加一個Task如下注釋:Stepstoaddcomponenttask1.addcomponenttask'sindex(Pleaseaddbeforesystemservice)添加Task索引(在系統(tǒng)服務(wù)之前)2.addcomponenttask'smoduleiddefinition(Pleaseaddbeforesystemservice)添加Task模塊ID(在系統(tǒng)服務(wù)之前)3.addmoduletotasktransformationinsyscomp_config.
8、c在syscomp_config.c中添加Task轉(zhuǎn)