亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        MSP430處理器內(nèi)存優(yōu)化配置技術(shù)研

        2016-05-27 08:46:12聶雅琴胡剛丁忠義

        聶雅琴,胡剛,丁忠義

        (第722研究所 低頻專業(yè)部,武漢 430079)

        ?

        聶雅琴,胡剛,丁忠義

        (第722研究所 低頻專業(yè)部,武漢 430079)

        摘要:基于MSP430F149單片機(jī)內(nèi)存分配方式,提出一種結(jié)合內(nèi)存映射文件的內(nèi)存實(shí)際使用值的計(jì)算方法。針對(duì)內(nèi)存使用越界問題,提出單片機(jī)靜態(tài)存儲(chǔ)區(qū)、堆、棧的內(nèi)存優(yōu)化配置策略。該優(yōu)化方法在某礦井救援通信設(shè)備控制系統(tǒng)中使用,獲得良好效果,有效避免了內(nèi)存不足所造成的運(yùn)行異常和死機(jī)現(xiàn)象,顯著提高了內(nèi)存利用率。

        關(guān)鍵詞:內(nèi)存優(yōu)化;嵌入式系統(tǒng);棧;堆;MSP430

        引言

        礦井應(yīng)急救援通信設(shè)備在井下?lián)岆U(xiǎn)救援通信應(yīng)用中,能進(jìn)行密閉坑道通信,保證被困人員和外界人員的通信暢通,是礦井安全生產(chǎn)和搶險(xiǎn)救災(zāi)的重要保障[1]。在礦井發(fā)生險(xiǎn)情時(shí),電力系統(tǒng)容易癱瘓[2],井下供電中斷,礦井應(yīng)急救援通信設(shè)備只能采用電池供電。因此,設(shè)備需要采用低功耗設(shè)計(jì)來保證救援過程中的長時(shí)間穩(wěn)定通信。

        MSP430是一款超低功耗的16位單片機(jī),處理能力強(qiáng)大、工作穩(wěn)定,常用于低功耗控制系統(tǒng)。本礦井救援通信設(shè)備采用MSP430F149作為處理器[3-5]。

        1內(nèi)存分配

        1.1MSP430F149存儲(chǔ)器結(jié)構(gòu)

        圖1 MSP430F149的存儲(chǔ)器結(jié)構(gòu)圖

        MSP430F149存儲(chǔ)器采用馮·諾依曼結(jié)構(gòu),程序存儲(chǔ)器Flash和數(shù)據(jù)存儲(chǔ)器RAM處于同一地址空間。MSP430F149存儲(chǔ)器結(jié)構(gòu)如圖1所示[6]。其中,程序存儲(chǔ)器容量為60 KB,其地址范圍為0x1100~0xFFFF,代碼段和常量表達(dá)式存儲(chǔ)于此空間;數(shù)據(jù)存儲(chǔ)器容量為2 KB,地址空間為0x0200~0x09FF。

        1.2MSP430F149內(nèi)存分配

        采用IAR公司的C編譯器EW430作為MSP430F149單片機(jī)編程環(huán)境。在EW430工程選項(xiàng)中設(shè)置鏈接時(shí)生成內(nèi)存映射文件(.map格式,以下簡稱MAP文件)。MAP文件中含有程序中的變量、函數(shù)以及各區(qū)段的地址映射情況,是分析MSP430F149內(nèi)存分配的重要依據(jù)。結(jié)合下面的程序,分析MSP430F149的內(nèi)存分配過程。

        程序1:

        uchar gBuffer[100];

        void test(uchar select){

        static uchar num = 1;

        if (0 == select){

        uchar buffer1[100];

        for(int i = 0; i < 100; ++i)

        buffer1[i] = 1;

        ……

        }

        else if (1 == select){

        uchar buffer2[200];

        for(int i = 0; i < 200; ++i)

        buffer2[i] = 2;

        ……

        }

        else if (2 == select){

        uchar *pBuffer3 = (uchar*)malloc(99);

        if ( NULL != pBuffer3 ){

        ……

        free(pBuffer3);

        }

        }

        else{

        ++num;

        }

        }

        MSP430F149的內(nèi)存分為3個(gè)部分:靜態(tài)存儲(chǔ)區(qū)、堆、棧[6-7]。在工程選項(xiàng)中設(shè)置棧和堆的大小分別為400字節(jié)和200字節(jié)。編譯程序1,打開編譯器生成的MAP文件,查看程序中變量分配地址、函數(shù)??臻g調(diào)用大小以及各區(qū)段的內(nèi)存映射情況。內(nèi)存中各區(qū)段內(nèi)存映射地址如表1所列。

        表1 各區(qū)段內(nèi)存映射地址

        其中,DATA16_I和DATA16_Z為靜態(tài)存儲(chǔ)區(qū)。全局變量和靜態(tài)變量屬于靜態(tài)分配,其存儲(chǔ)空間在程序編譯期進(jìn)行分配,并存在于整個(gè)程序運(yùn)行期間[6-7]。DATA16_I段存儲(chǔ)已初始化的全局/靜態(tài)變量,故num變量地址在此段中;DATA16_Z段存儲(chǔ)未初始化或初始化為0的全局/靜態(tài)變量,故g_Buffer數(shù)組屬于此段內(nèi)存。靜態(tài)存儲(chǔ)區(qū)從RAM起始地址(0x0200)開始,大小由程序中的全局變量和靜態(tài)變量占用空間決定。變量內(nèi)存映射地址如表2所列。

        表2 變量內(nèi)存映射地址

        DATA16_HEAP為堆區(qū),堆區(qū)緊挨著靜態(tài)存儲(chǔ)區(qū),首地址為偶地址,大小為工程設(shè)置值200字節(jié)。堆上的內(nèi)存由內(nèi)存分配函數(shù)(new或malloc)申請(qǐng),并由內(nèi)存釋放函數(shù)(delete或free)釋放。程序1中pBuffer3內(nèi)存空間則從堆上分配。

        CSTACK為棧區(qū),棧從高地址(0x09FF)往低地址進(jìn)行分配,大小為工程設(shè)置值400字節(jié)。程序運(yùn)行時(shí),局部變量和函數(shù)參數(shù)的存儲(chǔ)空間在棧上創(chuàng)建,函數(shù)執(zhí)行時(shí)由系統(tǒng)自動(dòng)分配并在運(yùn)行結(jié)束時(shí)由系統(tǒng)自動(dòng)釋放。調(diào)用程序1中的test()函數(shù)時(shí),系統(tǒng)自動(dòng)分配的??臻g大小為302(0x012E)字節(jié),如表3所列。函數(shù)調(diào)用時(shí),依次將test()函數(shù)地址(2字節(jié))、 buffer1(200字節(jié))數(shù)組、buffer2(100字節(jié))數(shù)組壓入棧中,故占用棧302字節(jié)。其中test()函數(shù)參數(shù)簡單,由編譯器優(yōu)化,不占用??臻g。

        表3 test函數(shù)地址和調(diào)用??臻g

        2內(nèi)存使用分析及優(yōu)化對(duì)策

        由前面的分析可知,MSP430F149內(nèi)存地址空間分布如圖2所示。

        圖2 MSP430F149內(nèi)存地址空間

        為了確保MSP430F149正常運(yùn)行,程序在任何時(shí)刻都應(yīng)該滿足如下條件:

        Sizeof(靜態(tài)存儲(chǔ)區(qū))+Sizeof(堆)+Sizeof(棧)≤2 KB

        編譯器可檢測編譯期的內(nèi)存設(shè)置是否越界,但無法檢測運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配失敗和系統(tǒng)棧內(nèi)存是否超過設(shè)置的棧指針值。因而,在程序設(shè)計(jì)和維護(hù)過程中,需要減小靜態(tài)分配區(qū)大小,合理分配堆、??臻g,保證堆棧區(qū)域有一定的彈性,預(yù)防意外透支[9]。

        2.1靜態(tài)存儲(chǔ)區(qū)優(yōu)化

        靜態(tài)存儲(chǔ)區(qū)在編譯時(shí)已完成分配,并存在于整個(gè)程序運(yùn)行期,因此對(duì)靜態(tài)存儲(chǔ)區(qū)進(jìn)行優(yōu)化十分必要。 優(yōu)化靜態(tài)存儲(chǔ)區(qū)的策略如下[10]:① 盡可能使用局部變量,而不是全局變量或者靜態(tài)變量,在運(yùn)行時(shí)給局部變量分配空間,使用完后立即釋放,避免一直占用內(nèi)存,這樣有利于編譯器編譯時(shí)更好地優(yōu)化所生成的代碼。 ② 在滿足運(yùn)算需求的前提下,盡量為變量定義字節(jié)數(shù)少的數(shù)據(jù)類型。

        2.2棧空間計(jì)算與優(yōu)化

        2.2.1計(jì)算運(yùn)行期內(nèi)存使用

        棧是從高地址向低地址進(jìn)行擴(kuò)展的連續(xù)內(nèi)存區(qū)域。在程序的運(yùn)行過程中,棧地址越界會(huì)導(dǎo)致正在使用的堆區(qū)或者靜態(tài)分配區(qū)中的數(shù)據(jù)被篡改,進(jìn)而造成軟件運(yùn)行異?;蛑貑?。程序運(yùn)行期的內(nèi)存使用情況可通過分析函數(shù)調(diào)用過程并依據(jù)MAP文件計(jì)算得出。

        程序1中,由main函數(shù)調(diào)用test函數(shù)過程中的棧使用情況如圖3所示。調(diào)用前,系統(tǒng)為main函數(shù)分配的空間已入棧;調(diào)用到test函數(shù)某處時(shí),系統(tǒng)又為test函數(shù)開辟??臻g;調(diào)用結(jié)束后,系統(tǒng)釋放test函數(shù)??臻g,?;氐秸{(diào)用前狀態(tài)。

        圖3 main函數(shù)調(diào)用test函數(shù)前后棧使用情況

        將MAP文件中函數(shù)F對(duì)應(yīng)的調(diào)用??臻g記為SF,則當(dāng)程序運(yùn)行到某一函數(shù)時(shí),??臻g的使用情況由當(dāng)前壓棧的各函數(shù)(F1,F(xiàn)2,…,Fn)棧空間決定,其大小為:

        在分析??臻g使用情況時(shí),除考慮函數(shù)間的相互調(diào)用外,還需考慮中斷的發(fā)生。進(jìn)入中斷處理程序時(shí),先前壓棧的函數(shù)棧空間仍在棧中,隨后壓入中斷處理進(jìn)程;中斷處理結(jié)束后,中斷處理函數(shù)??臻g出棧,程序繼續(xù)運(yùn)行中斷前的函數(shù)。伴隨著中斷的突發(fā),棧的使用情況愈加復(fù)雜。

        程序運(yùn)行期的內(nèi)存實(shí)際使用值為:Mem=sizeof(靜態(tài)存儲(chǔ)區(qū))+sizeof(堆)+Ssum。當(dāng)Mem>2KB時(shí),??臻g越界,系統(tǒng)內(nèi)存不足。

        2.2.2??臻g的優(yōu)化

        通過分析內(nèi)存使用情況,可得知程序中會(huì)出現(xiàn)??臻g越界的調(diào)用過程,并針對(duì)其中的??臻g消耗大的函數(shù)進(jìn)行優(yōu)化。優(yōu)化棧空間的方法如下:

        ① 細(xì)化函數(shù)功能,延遲內(nèi)存分配,提高效率。函數(shù)中的局部自動(dòng)變量,并非在函數(shù)整個(gè)生命周期都被使用,但卻一直占用??臻g??蓪⒑瘮?shù)功能細(xì)化,采用多個(gè)小函數(shù)實(shí)現(xiàn),在需要時(shí)分配內(nèi)存,使用結(jié)束后能及時(shí)釋放。在程序1里,test函數(shù)中buffer1和buffer2只在各自if分支內(nèi)有意義,故可對(duì)test函數(shù)重構(gòu)如下:

        程序2:

        voidfunc_1(){

        ucharbuffer1[100];

        ……

        }

        voidfunc_2(){

        ucharbuffer2[200];

        ……

        }

        voidtest(ucharselect){

        staticucharnum= 1;

        if(0 ==select){

        func_1();

        }

        elseif(1 ==select){

        func_2();

        }

        ……

        }

        編譯代碼,查看程序2對(duì)應(yīng)的MAP文件,各函數(shù)的棧調(diào)用空間大小如表4所列。

        優(yōu)化前,調(diào)用test函數(shù),??臻g大小為302字節(jié)。優(yōu)化后,調(diào)用test函數(shù),棧空間最大使用值(運(yùn)行test(1)時(shí))為204字節(jié),節(jié)省98字節(jié)??臻g;當(dāng)運(yùn)行test(2)語句時(shí),??臻g相對(duì)優(yōu)化前節(jié)省300字節(jié)。

        表4 程序2中各函數(shù)的棧調(diào)用空間

        ② 設(shè)計(jì)程序時(shí),應(yīng)盡量減少函數(shù)調(diào)用的層次和遞歸調(diào)用。在函數(shù)結(jié)束后,系統(tǒng)自動(dòng)釋放函數(shù)中的局部變量,而不是在變量使用時(shí)結(jié)束。因此多層次嵌套調(diào)用和多次遞歸調(diào)用,會(huì)導(dǎo)致上層調(diào)用的棧空間無法釋放,從而耗費(fèi)??臻g。

        2.3堆的設(shè)置與使用

        2.3.1堆空間的設(shè)置

        堆的申請(qǐng)和釋放由程序員控制,在使用上比較靈活。合理設(shè)置堆的大小,既能避免動(dòng)態(tài)內(nèi)存申請(qǐng)失敗,又不至于影響棧區(qū)大小。

        當(dāng)申請(qǐng)堆空間成功后,會(huì)在這塊內(nèi)存空間的首地址(2字節(jié))記錄本次分配的內(nèi)存的大小,并且分配的??臻g大小總為偶數(shù)。在程序1中,堆地址空間為0x026C~0x0333,若執(zhí)行語句

        uchar *pTestBuf3 = (uchar*)malloc(99);

        則地址為0x026C的內(nèi)存數(shù)據(jù)變?yōu)?02(0x0066),而pTestBuf3指針地址為0x026E。

        2.3.2巧用堆分配

        由于堆的分配效率低于棧,在內(nèi)存充足時(shí)應(yīng)盡量使用棧分配,避免使用堆分配。當(dāng)經(jīng)過靜態(tài)存儲(chǔ)區(qū)和??臻g優(yōu)化過程后,內(nèi)存使用仍舊出現(xiàn)越界的情況時(shí),可以考慮利用動(dòng)態(tài)內(nèi)存的方式來緩解內(nèi)存問題。

        在程序1中,假設(shè)運(yùn)行到test(1)時(shí),棧中剩余空間大小為120字節(jié),此時(shí)就會(huì)訪問越界。在這種情況下,可以適當(dāng)減少系統(tǒng)??臻g,來增加堆空間,并將buffer1和buffer2采用動(dòng)態(tài)內(nèi)存實(shí)現(xiàn)。這樣不僅能正常運(yùn)行程序,還會(huì)節(jié)省不少內(nèi)存空間。

        程序3:

        voidtest(ucharselect){

        staticucharnum= 1;

        if(0 ==select){

        uchar*buffer1 = (uchar*)malloc(100);

        ……

        }

        elseif(1 ==select){

        uchar*buffer2 = (uchar*)malloc(200);

        ……

        }

        ……

        }

        由前面的分析可以得出,優(yōu)化后的程序3的堆空間需求為202字節(jié),即運(yùn)行test(1)時(shí),在保證程序正常運(yùn)行前提下,程序1~3中test函數(shù)對(duì)系統(tǒng)內(nèi)存的最小需求情況略——編者注??梢姡绦?(相對(duì)程序1和程序2)利用動(dòng)態(tài)內(nèi)存更加靈活,有效減少了內(nèi)存的使用,提高了利用率。

        3優(yōu)化結(jié)果分析

        礦井應(yīng)急救援通信設(shè)備實(shí)現(xiàn)了多臺(tái)機(jī)器組網(wǎng)通信、收/發(fā)報(bào)文、讀/寫報(bào)文歷史信息以及人機(jī)交互等多種功能。程序優(yōu)化前,在實(shí)際使用中發(fā)現(xiàn),部分情況下會(huì)出現(xiàn)設(shè)備異常的現(xiàn)象。采用本文的內(nèi)存空間使用分析方法,得出在兩種情況下會(huì)出現(xiàn)內(nèi)存不足:①當(dāng)用戶進(jìn)入發(fā)送報(bào)文選擇界面時(shí),設(shè)備進(jìn)入定時(shí)發(fā)送報(bào)文的定時(shí)中斷處理流程;②當(dāng)用戶進(jìn)入發(fā)送報(bào)文選擇界面時(shí),串口中斷發(fā)生,并進(jìn)入接收?qǐng)?bào)文解析處理流程。這兩種情況下??臻g的實(shí)際分配大小大于系統(tǒng)設(shè)置??臻g。經(jīng)多次實(shí)驗(yàn)證實(shí),當(dāng)這兩種情況發(fā)生時(shí),程序會(huì)出現(xiàn)死機(jī)或重啟現(xiàn)象,故對(duì)靜態(tài)存儲(chǔ)區(qū)、堆、??臻g進(jìn)行優(yōu)化,并合理配置堆棧空間。優(yōu)化前后系統(tǒng)內(nèi)存使用情況略——編者注。

        可見,優(yōu)化后上述兩種情況下的內(nèi)存使用均小于2KB,程序不再出現(xiàn)異常。本文的內(nèi)存分析方法能有效找出程序內(nèi)存不足的運(yùn)行場景。本文的內(nèi)存分析和優(yōu)化方法可擴(kuò)展到其他主控芯片,對(duì)于在嵌入式系統(tǒng)上開發(fā)較復(fù)雜的程序具有實(shí)際意義。

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

        參考文獻(xiàn)

        [1] 易濱,劉勇,陳靜.礦井透地通信與接收電路運(yùn)放設(shè)計(jì)[J].艦船電子工程,2014,34(3):72-75.

        [2] 沈力.基于無線通信的礦井監(jiān)控系統(tǒng)的優(yōu)化設(shè)計(jì)研究[D].重慶:重慶大學(xué),2012.

        [3] 宰文姣.基于MSP430單片機(jī)的礦井無線報(bào)警系統(tǒng)設(shè)計(jì)[J].西南民族大學(xué)學(xué)報(bào):自然科學(xué)版,2013,39(1):145-150.

        [4] 陶晉宜.穿透地層的礦井地下無線通信系統(tǒng)方案設(shè)計(jì)[J].太原理工大學(xué)報(bào),2000,31(1):40-41.

        [5] Kumarsagar,Dange,Patil.Design of Monitoring System for Coal Mine Safe Base On Msp430[J].International Journal of Engineering Science Invention ISSN,2013,2(7):14-19.

        [6] 魏小龍.MSP430系列單片機(jī)接口設(shè)計(jì)及系統(tǒng)設(shè)計(jì)實(shí)例[M].北京:北京航空航天大學(xué)出版社,2002.

        [7] 楊麗慧.C/C++內(nèi)存分配的五種方法[J].承德民族師專學(xué)報(bào),2007,27(2):25-26.

        [8] 韓雨澇.C語言動(dòng)態(tài)內(nèi)存分配研究及應(yīng)用[J].計(jì)算機(jī)時(shí)代,2009(5):33-34.

        [9] 陳惠端,吳錘紅.MCS-51系列單片機(jī)的堆棧及其應(yīng)用[J].福建農(nóng)業(yè)大學(xué)學(xué)報(bào),1999,28(1):115-120.

        [10] 張晞,王德銀,張晨.MSP430系列單片機(jī)實(shí)用C語言[M].北京:人民郵電出版社,2005.

        聶雅琴(工程師),主要從事嵌入式系統(tǒng)軟件開發(fā)。

        (責(zé)任編輯:薛士然收修改稿日期:2015-11-24)

        Nie Yaqin,Hu Gang,Ding Zhongyi

        (Low Frequency Telecommunication Department,The 722 Research Institute,Wuhan 430079,China)

        Abstract:Based on the analysis of the memory allocation of MSP430F149,a method for calculating the value of memory actually used is proposed.Aiming at the problem of memory usage bounds,the strategy of optimizing the allocation of memory chip static memory,heap and stack is proposed.The optimizing method has been applied practically in the communication controller system of a mine rescue equipment and acquires satisfied effect.It could effectively avoid the abnormal phenomena and interruption of the program,and enhance the utilization rate of memory.

        Key words:memory optimization;embedded system;stack;heap;MSP430

        中圖分類號(hào):TP311

        文獻(xiàn)標(biāo)識(shí)碼:A

        国产熟女露脸大叫高潮| 日韩精品一区二区免费| 狠狠色丁香婷婷久久综合| 日韩制服国产精品一区| 国产爆乳乱码女大生Av| 亚洲中国美女精品久久久| 精品久久久少妇一区二区| 国产精品久久久国产盗摄| 亚洲自拍另类制服在线| 岛国av一区二区三区| 青草久久婷婷亚洲精品| 国产裸体舞一区二区三区| 亚洲视频毛片| 久久精品国产视频在热| av在线免费高清观看| 亚洲国产精品va在线看黑人| 香蕉视频毛片| 亚洲成人色黄网站久久| 国产精品亚洲av三区亚洲| 亚洲人成网站18禁止久久影院| 91白浆在线视频| 日本加勒比一道本东京热| 免费a级毛片无码免费视频首页| 亚洲人成色777777老人头| 国产69口爆吞精在线视频喝尿| 蜜桃视频在线在线观看| 少妇粉嫩小泬喷水视频| 中文字幕亚洲欧美日韩在线不卡| 久久99热精品免费观看麻豆| 中文乱码字幕精品高清国产 | 中文字幕巨乱亚洲| 亚洲中文字幕视频第一二区| 亚洲人成影院在线无码按摩店| 少妇高潮喷水正在播放| 一区二区三区熟妇人妻18| AV无码专区亚洲AVL在线观看| 亚洲一区二区三区重口另类| 免费看av在线网站网址| 不卡高清av手机在线观看| 久久精品女人天堂av麻| 少妇爆乳无码专区|