www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]Keil C動態(tài)內存管理機制分析及改進

    Keil C是常用的嵌入式系統(tǒng)編程工具,它通過init_mempool、mallloe、free等函數,提供了動態(tài)存儲管理等功能。本文通過對init_mempool、mallloe和free這3個KeilC庫函數源代碼的分析,揭示其實現的原理和方法,并對其中的不足作了改進,以使Keil C編程人員更好地應用動態(tài)存儲管理。

1 相關數據結構、變量及說明
   
在Keil C安裝目錄下的\c5l\lib目錄下,有實現init_mempool、mallloe和free這3個函數的C源文件init_mere.c、malloc.e和free.c。下面針對keil C7.5A版,將其中與動態(tài)存儲管理相關的數據結構介紹如下;
   

    該結構的next指向堆中的下一空閑內存塊,len表示該空閑塊除去該塊首部的struct__mem__結構所占的字節(jié)數后,該塊實際可用的字節(jié)數。由于next是一個指向XDATA區(qū)的指針,故在Keil C中應用程序所定義的堆空間應在XDATA段中定義。

    在Keil C中,堆中的所有空閑內存塊是用一個單鏈表來管理的,struct_mere_即為該鏈表結點的結構,后面定義的宏AVAIL為該鏈表的首結點,為敘述方便,以下將該鏈表稱為AVAIL鏈表。

   

    #define AVAIL(__meM_avaiL_[O])
    全局數組__meM_ avail_實際也是struct__mem__類型,__mem_avail__[O]的next指向堆中首塊空閑塊。如果堆中已無空閑內存塊,則__mem_avail__[0]的next為NULL(0值)。為使程序代碼簡潔,定義了宏AVAIL來代替__mem_avail__[O]。

2 init_mempool函數剖析
   
函數int_mempool(void_MALLOC_MEM_*
pool,unsigned int size)失敗時將返回0,成功則返回一1,參數pool指向應用程序定義的堆空間,參數size為堆空間的字節(jié)數。如果應用程序提供的堆空間太小(size的值太小),將失去實際意義,故函數將返回0表示失敗。當size參數足夠大,則會初始化AVAIL(即_mem_avail__[O]),使其next域指向pool參數所指向的堆空間,len域為pool參數所指向的堆空間的總字節(jié)數size。其在KeilC 7.5A庫中init_mem.C的源代碼如下:
   

    在成功執(zhí)行init_mempool函數后,將得到如圖1所示的一個數據結構。另外,鏈首結點AVAIL的len域記錄了整個堆的字節(jié)數。鏈首AVAIL結點的next域指向的是首塊空閑塊,當經過多次的malloe函數而堆中投有空閑內存塊時,AVAIL結點的next域將為NULL值。

    很明顯,從上面的if(pool==NULL){pool=1;size--;)這部分源代碼來看,如果應用程序中pool參數為空指針(pool為0)時,顯然不能直接將AVAIL,的next域的值賦為空指針的(即賦為O)。將pool的值改為1,再將size的值減l,這樣,init_mempool函數會在XDATA區(qū)中,從地址l開始,取size一1個字節(jié)作為堆來使用。如果源程序有定義在XDATA區(qū)的變量,則這些變量所占的存儲單元也可能會被當成堆空間的一部分,這無疑是有潛在風險的。

    部分程序員在調用init_mempool函數時,習慣將pool參數設為一個形如0xAAAA數字表示的絕對地址,如果不加特別防范,也是不妥的,因為Keil C可能會在此方式指定的堆空間中分配臨時變量。好的習慣是定義一個字節(jié)數組作為堆空間,再將數組名作為pool參數調用init_mempool函數。

    在Keil C的聯(lián)機文檔中,指明了init_mempool在應用程序中只能被調用一次,那么,如果多次調用該函數又會有什么后果呢?從該函數的源代碼來分析,多次調用init_mempoo1函數,會導致重新初始化首結點AVAIL的next域和len域的值,將使AVAIL鏈表中的原有管理信息丟失,從而導致一些很難診斷的問題。

    對此問題,可采用如下保護措施。當發(fā)現AVAIL鏈表中已有管理信息時,則返回失敗標志,函數直接返回。具體的方法是檢查AVAIL結點的len域,由于其被初始化為零,如果發(fā)現其值非零,則表明init_mempool函數已被成功調用過,此時函數直接返回。

3 malloc函數分析
    malloc函數的原形是void *malloc(unsigned intsize),size參數為需動態(tài)申請的內存塊的字節(jié)數。

    malloc函數的算法是查找AVAIL鏈表中各結點next指針所指向的空閑內存塊。如果某塊的空閑字節(jié)數≥size參數,則停止查找,并從該塊進行內存分配,返回一個指向所分配內存塊的指針給應用程序。如果沒有找到符合要求的空閑內存塊,則返回空指針給應用程序。

    需要注意的是,AVAIL鏈表中除首結點AVAIL外,其余各節(jié)點位于堆中各空閑內存塊開始處的一個struct__mem__結構中,其len域為該空閑塊總字節(jié)數減去sizeof(stiuct__mem)后的值,即該塊實際空閑的字節(jié)數;next域指向堆中下一空閑內存塊。

    設鏈表節(jié)點p指向所找到的空閑內存塊,如果在p空閑塊分配size個字節(jié)后,剩余的字節(jié)數不多,則將p塊從AVAIL鏈表中刪除,然后返回一個指向p塊偏移sizeof(struct__mem)處的指針。如果在p空閑塊分配size個字節(jié)后,該塊仍剩余較多的字節(jié)數,則需對該塊進行分割,將多出的這一部分保留在AVAIL鏈表中。(以下部分有省略,全文請見本刊網站——編者注)

4 free函數分析及改進
    free函數的原形是void free(void xdata *memp),參數memp指向所要釋放的內存塊。

    在AVAIL鏈表中,各結點是按其所指空閑內存塊開始地址的大小按升序排列的。free函數的算法是在AVAIL鏈表中查一個節(jié)點p(其前驅為q),當p節(jié)點所指空問內存塊的地址大于參數memp所指內存塊的起始地址時,則將memp塊插入到該節(jié)點之前,如沒有找到這樣的節(jié)點,則memp塊插到鏈尾。在插入memp塊時,還將檢查在memp塊的前后是否存在地址相鄰的空閑內存塊,如果有,則將memp塊與相鄰塊合并。(free庫函數的部分源代碼見本刊網站——編者注)

    值得探討的是最后一段將memp塊與前一塊(q塊)合并的這部分代碼。如果在執(zhí)行此部分代碼之前,q指向首結點AVAIL,而此時欲將q塊與memp塊合并,顯然是不合理的。實際上,此時應當將q的next指針的值設為memp塊的開始地址p0。由于KeilC7.5A中,free庫函數的源程序中沒有考慮這種特殊情況,因此可能會引發(fā)嚴重后果。

    由源代碼分析可知,q指向首結點AVAIL,而此時如果滿足。memp塊與q塊合并的判定條件,執(zhí)行q>1en+=p0一>Len+HL,EN和q一>next=pO一>next后,不但不能回收內存,反而導致memp塊丟失;同時,AVAIL的len域的值也不正確。如果此時pO一>next又為NULL,則會導致整個堆內存的丟失。

    筆者特在Keil C7.5 A版中設計了一個示例(見本刊網站),用于引發(fā)該錯誤。要防止這種錯誤,只需將if((((char_MALLOC_MEM_*)q)+q一>len+HLEN)==pO)判定語句改為if((q!=&AVAIL)&&(((char_MALLOC_MEM_*)q)+q一>len+HLEN)==p0)即可。有興趣的可通過電子郵件與筆者聯(lián)系(cqdoml@sina.com)。

    編者注:本文為期刊縮略版,全文見網站www.mesnet.com.cn。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

成都2022年10月19日 /美通社/ -- 近期,平安養(yǎng)老險積極籌備個人養(yǎng)老金的產品設計和系統(tǒng)開發(fā)工作,發(fā)展多樣化的養(yǎng)老金融產品,推動商業(yè)養(yǎng)老保險、個人養(yǎng)老金、專屬商業(yè)養(yǎng)老保險等產品供給。 搭養(yǎng)老政策東風 ...

關鍵字: 溫度 BSP 東風 大眾

廣東佛山2022年10月19日 /美通社/ -- 空間是人居生活的基礎單元,承載著生存與活動的最基本功能。而對于理想空間的解構意義卻在物理性容器之外,體現出人們對于空間和生活深層關系的思考,同時也塑造著人與空間的新型連接...

關鍵字: 溫度 BSP 智能化 進程

上海2022年10月19日 /美通社/ -- 10月17日晚間,安集科技披露業(yè)績預告。今年前三季度,公司預計實現營業(yè)收入7.54億元至8.33億元,同比增長60.24%至77.03%;歸母凈利潤預計為1.73億...

關鍵字: 電子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市經濟和信息化局發(fā)布2022年度第一批北京市市級企業(yè)技術中心創(chuàng)建名單的通知,諾誠健華正式獲得"北京市企業(yè)技術中心"認定。 北京市企業(yè)技...

關鍵字: BSP ARMA COM 代碼

北京2022年10月18日 /美通社/ -- 10月14日,國際數據公司(IDC)發(fā)布《2022Q2中國軟件定義存儲及超融合市場研究報告》,報告顯示:2022年上半年浪潮超融合銷售額同比增長59.4%,近5倍于...

關鍵字: IDC BSP 數字化 數據中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都銀行集團成立60周年的紀念日。趁著首都銀行集團成立60周年與首都銀行(中國)在華深耕經營12年的“大日子”,圍繞作為外資金融機構對在華戰(zhàn)略的構想和業(yè)...

關鍵字: 數字化 BSP 供應鏈 控制

東京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式會社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團公司上海通運國際物流有限公司(Nipp...

關鍵字: 溫控 精密儀器 半導體制造 BSP

廣州2022年10月18日 /美通社/ -- 10月15日,第 132 屆中國進出口商品交易會("廣交會")于"云端"開幕。本屆廣交會上高新技術企業(yè)云集,展出的智能產品超過140,...

關鍵字: 中國智造 BSP 手機 CAN

要問機器人公司哪家強,波士頓動力絕對是其中的佼佼者。近來年該公司在機器人研發(fā)方面獲得的一些成果令人印象深刻,比如其開發(fā)的機器人會后空翻,自主爬樓梯等。這不,波士頓動力又發(fā)布了其機器人組團跳男團舞的新視頻,表演的機器人包括...

關鍵字: 機器人 BSP 工業(yè)機器人 現代汽車

南京2022年10月17日 /美通社/ -- 日前《2022第三屆中國高端家電品牌G50峰會》于浙江寧波落幕,來自兩百余名行業(yè)大咖、專家學者共同探討了在形勢依然嚴峻的當下,如何以科技創(chuàng)新、高端化轉型等手段,幫助...

關鍵字: LINK AI BSP 智能家電

嵌入式教程

6897 篇文章

關注

發(fā)布文章

編輯精選

技術子站

關閉