999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

MSP430處理器內存優化配置技術研

2016-05-27 08:46:12聶雅琴胡剛丁忠義
單片機與嵌入式系統應用 2016年5期

聶雅琴,胡剛,丁忠義

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

?

聶雅琴,胡剛,丁忠義

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

摘要:基于MSP430F149單片機內存分配方式,提出一種結合內存映射文件的內存實際使用值的計算方法。針對內存使用越界問題,提出單片機靜態存儲區、堆、棧的內存優化配置策略。該優化方法在某礦井救援通信設備控制系統中使用,獲得良好效果,有效避免了內存不足所造成的運行異常和死機現象,顯著提高了內存利用率。

關鍵詞:內存優化;嵌入式系統;棧;堆;MSP430

引言

礦井應急救援通信設備在井下搶險救援通信應用中,能進行密閉坑道通信,保證被困人員和外界人員的通信暢通,是礦井安全生產和搶險救災的重要保障[1]。在礦井發生險情時,電力系統容易癱瘓[2],井下供電中斷,礦井應急救援通信設備只能采用電池供電。因此,設備需要采用低功耗設計來保證救援過程中的長時間穩定通信。

MSP430是一款超低功耗的16位單片機,處理能力強大、工作穩定,常用于低功耗控制系統。本礦井救援通信設備采用MSP430F149作為處理器[3-5]。

1內存分配

1.1MSP430F149存儲器結構

圖1 MSP430F149的存儲器結構圖

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

1.2MSP430F149內存分配

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

程序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的內存分為3個部分:靜態存儲區、堆、棧[6-7]。在工程選項中設置棧和堆的大小分別為400字節和200字節。編譯程序1,打開編譯器生成的MAP文件,查看程序中變量分配地址、函數??臻g調用大小以及各區段的內存映射情況。內存中各區段內存映射地址如表1所列。

表1 各區段內存映射地址

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

表2 變量內存映射地址

DATA16_HEAP為堆區,堆區緊挨著靜態存儲區,首地址為偶地址,大小為工程設置值200字節。堆上的內存由內存分配函數(new或malloc)申請,并由內存釋放函數(delete或free)釋放。程序1中pBuffer3內存空間則從堆上分配。

CSTACK為棧區,棧從高地址(0x09FF)往低地址進行分配,大小為工程設置值400字節。程序運行時,局部變量和函數參數的存儲空間在棧上創建,函數執行時由系統自動分配并在運行結束時由系統自動釋放。調用程序1中的test()函數時,系統自動分配的棧空間大小為302(0x012E)字節,如表3所列。函數調用時,依次將test()函數地址(2字節)、 buffer1(200字節)數組、buffer2(100字節)數組壓入棧中,故占用棧302字節。其中test()函數參數簡單,由編譯器優化,不占用??臻g。

表3 test函數地址和調用棧空間

2內存使用分析及優化對策

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

圖2 MSP430F149內存地址空間

為了確保MSP430F149正常運行,程序在任何時刻都應該滿足如下條件:

Sizeof(靜態存儲區)+Sizeof(堆)+Sizeof(棧)≤2 KB

編譯器可檢測編譯期的內存設置是否越界,但無法檢測運行時動態內存分配失敗和系統棧內存是否超過設置的棧指針值。因而,在程序設計和維護過程中,需要減小靜態分配區大小,合理分配堆、??臻g,保證堆棧區域有一定的彈性,預防意外透支[9]。

2.1靜態存儲區優化

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

2.2棧空間計算與優化

2.2.1計算運行期內存使用

棧是從高地址向低地址進行擴展的連續內存區域。在程序的運行過程中,棧地址越界會導致正在使用的堆區或者靜態分配區中的數據被篡改,進而造成軟件運行異?;蛑貑?。程序運行期的內存使用情況可通過分析函數調用過程并依據MAP文件計算得出。

程序1中,由main函數調用test函數過程中的棧使用情況如圖3所示。調用前,系統為main函數分配的空間已入棧;調用到test函數某處時,系統又為test函數開辟??臻g;調用結束后,系統釋放test函數??臻g,?;氐秸{用前狀態。

圖3 main函數調用test函數前后棧使用情況

將MAP文件中函數F對應的調用??臻g記為SF,則當程序運行到某一函數時,棧空間的使用情況由當前壓棧的各函數(F1,F2,…,Fn)棧空間決定,其大小為:

在分析??臻g使用情況時,除考慮函數間的相互調用外,還需考慮中斷的發生。進入中斷處理程序時,先前壓棧的函數棧空間仍在棧中,隨后壓入中斷處理進程;中斷處理結束后,中斷處理函數棧空間出棧,程序繼續運行中斷前的函數。伴隨著中斷的突發,棧的使用情況愈加復雜。

程序運行期的內存實際使用值為:Mem=sizeof(靜態存儲區)+sizeof(堆)+Ssum。當Mem>2KB時,??臻g越界,系統內存不足。

2.2.2??臻g的優化

通過分析內存使用情況,可得知程序中會出現??臻g越界的調用過程,并針對其中的棧空間消耗大的函數進行優化。優化??臻g的方法如下:

① 細化函數功能,延遲內存分配,提高效率。函數中的局部自動變量,并非在函數整個生命周期都被使用,但卻一直占用??臻g。可將函數功能細化,采用多個小函數實現,在需要時分配內存,使用結束后能及時釋放。在程序1里,test函數中buffer1和buffer2只在各自if分支內有意義,故可對test函數重構如下:

程序2:

voidfunc_1(){

ucharbuffer1[100];

……

}

voidfunc_2(){

ucharbuffer2[200];

……

}

voidtest(ucharselect){

staticucharnum= 1;

if(0 ==select){

func_1();

}

elseif(1 ==select){

func_2();

}

……

}

編譯代碼,查看程序2對應的MAP文件,各函數的棧調用空間大小如表4所列。

優化前,調用test函數,??臻g大小為302字節。優化后,調用test函數,棧空間最大使用值(運行test(1)時)為204字節,節省98字節??臻g;當運行test(2)語句時,棧空間相對優化前節省300字節。

表4 程序2中各函數的棧調用空間

② 設計程序時,應盡量減少函數調用的層次和遞歸調用。在函數結束后,系統自動釋放函數中的局部變量,而不是在變量使用時結束。因此多層次嵌套調用和多次遞歸調用,會導致上層調用的??臻g無法釋放,從而耗費??臻g。

2.3堆的設置與使用

2.3.1堆空間的設置

堆的申請和釋放由程序員控制,在使用上比較靈活。合理設置堆的大小,既能避免動態內存申請失敗,又不至于影響棧區大小。

當申請堆空間成功后,會在這塊內存空間的首地址(2字節)記錄本次分配的內存的大小,并且分配的??臻g大小總為偶數。在程序1中,堆地址空間為0x026C~0x0333,若執行語句

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

則地址為0x026C的內存數據變為102(0x0066),而pTestBuf3指針地址為0x026E。

2.3.2巧用堆分配

由于堆的分配效率低于棧,在內存充足時應盡量使用棧分配,避免使用堆分配。當經過靜態存儲區和??臻g優化過程后,內存使用仍舊出現越界的情況時,可以考慮利用動態內存的方式來緩解內存問題。

在程序1中,假設運行到test(1)時,棧中剩余空間大小為120字節,此時就會訪問越界。在這種情況下,可以適當減少系統棧空間,來增加堆空間,并將buffer1和buffer2采用動態內存實現。這樣不僅能正常運行程序,還會節省不少內存空間。

程序3:

voidtest(ucharselect){

staticucharnum= 1;

if(0 ==select){

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

……

}

elseif(1 ==select){

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

……

}

……

}

由前面的分析可以得出,優化后的程序3的堆空間需求為202字節,即運行test(1)時,在保證程序正常運行前提下,程序1~3中test函數對系統內存的最小需求情況略——編者注??梢?,程序3(相對程序1和程序2)利用動態內存更加靈活,有效減少了內存的使用,提高了利用率。

3優化結果分析

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

可見,優化后上述兩種情況下的內存使用均小于2KB,程序不再出現異常。本文的內存分析方法能有效找出程序內存不足的運行場景。本文的內存分析和優化方法可擴展到其他主控芯片,對于在嵌入式系統上開發較復雜的程序具有實際意義。

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

參考文獻

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

[2] 沈力.基于無線通信的礦井監控系統的優化設計研究[D].重慶:重慶大學,2012.

[3] 宰文姣.基于MSP430單片機的礦井無線報警系統設計[J].西南民族大學學報:自然科學版,2013,39(1):145-150.

[4] 陶晉宜.穿透地層的礦井地下無線通信系統方案設計[J].太原理工大學報,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系列單片機接口設計及系統設計實例[M].北京:北京航空航天大學出版社,2002.

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

[8] 韓雨澇.C語言動態內存分配研究及應用[J].計算機時代,2009(5):33-34.

[9] 陳惠端,吳錘紅.MCS-51系列單片機的堆棧及其應用[J].福建農業大學學報,1999,28(1):115-120.

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

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

(責任編輯:薛士然收修改稿日期: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

中圖分類號:TP311

文獻標識碼:A

主站蜘蛛池模板: 98超碰在线观看| 少妇精品网站| 在线看片免费人成视久网下载| 日本尹人综合香蕉在线观看| 亚洲码一区二区三区| www亚洲天堂| 国产青青草视频| 欧美黄色a| 97国产精品视频人人做人人爱| A级毛片高清免费视频就| 日日摸夜夜爽无码| 久久综合久久鬼| 天天躁夜夜躁狠狠躁图片| 综合色88| 情侣午夜国产在线一区无码| 天堂成人在线| AV熟女乱| 欧美国产综合色视频| 久久黄色毛片| 亚洲精品制服丝袜二区| 久久免费视频播放| 欧美在线视频不卡第一页| 欧美一级高清免费a| 国产男人的天堂| 国产视频自拍一区| 亚洲视频在线网| 国产一在线观看| 日本国产在线| 欧美色综合久久| 亚洲三级片在线看| 最新国产网站| 性做久久久久久久免费看| 国产成人精品免费视频大全五级| 69视频国产| 亚洲福利片无码最新在线播放| 无码中文字幕精品推荐| 国产福利2021最新在线观看| 一级全免费视频播放| 五月婷婷综合色| 在线a视频免费观看| 国模极品一区二区三区| 亚洲熟妇AV日韩熟妇在线| 国产午夜一级淫片| 91精品国产91久无码网站| 一级毛片免费观看不卡视频| 97精品久久久大香线焦| 婷婷色在线视频| 国产熟女一级毛片| 亚洲第一天堂无码专区| 国产主播一区二区三区| 天天综合色网| 日本人妻丰满熟妇区| 日韩欧美国产三级| аⅴ资源中文在线天堂| 国产综合日韩另类一区二区| 香蕉综合在线视频91| 一级高清毛片免费a级高清毛片| 高清色本在线www| 中美日韩在线网免费毛片视频| 国产91高清视频| 久久超级碰| 色婷婷电影网| 久久久国产精品免费视频| 国产剧情国内精品原创| 精品三级在线| 69av免费视频| 亚洲精品无码抽插日韩| 欧美精品在线观看视频| 九色免费视频| 中文字幕有乳无码| 亚洲国产中文精品va在线播放| a毛片在线播放| 国产在线精品人成导航| 18禁高潮出水呻吟娇喘蜜芽| 国产欧美日韩精品第二区| 久久国产热| 嫩草国产在线| 亚洲男人天堂久久| 精品国产网| 99九九成人免费视频精品| 亚洲欧美综合在线观看| 性色在线视频精品|