專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

MSP430在CCS開發(fā)環(huán)境下的內(nèi)存分配

作者:未知   來源:轉(zhuǎn)自學(xué)會珍惜LW   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月27日   【字體:

       用CCS開發(fā)環(huán)境以及有一年多了,之前寫程序,僅僅是停留在寫程序的階段,從來沒有想過內(nèi)存是如何分配的。這次做這個,由于程序的代碼量比較大,有40K+,所以在程序整合編譯的過程中,遇到了一些之前沒有遇到過的問題,在查閱了一些資料之后,解決了這些問題,在這里做一下總結(jié)。

 

      首先,我們先拋出遇到的問題。在將程序整合之后,編譯報(bào)錯了,報(bào)的錯誤如下圖所示。這個問題是說重定向時(shí),重定向的地址為17位,太大了,超過了16位譯碼的范圍。

      這里這個問題我是這樣理解的,是這些函數(shù)中需要調(diào)用一些字符串常量(根據(jù)錯誤定位得出的結(jié)論),這時(shí)候需要跳轉(zhuǎn)到這個常量所在的地址,但是由于這個地址離當(dāng)前函數(shù)所在的地址“太遠(yuǎn)了”,所以沒有辦法跳轉(zhuǎn)到那里執(zhí)行。
      有了這樣的分析,我們很自然地想到,如果這些字符串常量能夠離程序所在的區(qū)域“近一些”,那么這個問題就能解決了。如何來控制字符串常量所在的存儲區(qū)域呢?這里我們需要了解一下cmd文件。
      以MSP430F6638的cmd文件為例,它主要包含了兩個信息。
      一個是關(guān)于MSP430F6638的內(nèi)存映射信息,如下圖所示。利用紅色的區(qū)域中的信息,我們也可以計(jì)算出,6638的RAM是從0x2400開始,大小為16K,USBRAM是從0x1c00開始,大小為2k,F(xiàn)LASH分為兩個區(qū)域總的大小為256K。


     另一個是關(guān)于變量、代碼等分配的存儲位置。如下如所示。我們需要重點(diǎn)關(guān)注的是紅色區(qū)域內(nèi)的信息。觀察一下。我們不難理解紅色區(qū)域內(nèi)代碼的含義,是將.bss段、.data段、.sysmem段及.stack段的信息放在RAM區(qū),而.test段等信息被存儲在FLASH區(qū)。這些段各代表什么呢?這里我也做了一下總結(jié),如下如所示。

        從上圖中,我們可以看到,字符串常量存儲的位置上FLASH1區(qū)或者FLASH2區(qū),可執(zhí)行代碼也是存儲在FLASH1去或者FLASH2區(qū)。這里出現(xiàn)這個問題的原因可能是可執(zhí)行代碼存儲在FLASH區(qū),但是需要的字符串常量存在是FLASH2區(qū),所以重定向時(shí),由于存儲的位置較遠(yuǎn),導(dǎo)致無法定向到。
        因此,我們考慮修改cmd文件,使得字符串常量全部存儲在FLASH區(qū)。在經(jīng)過了這樣的修改之后,再編譯時(shí),不再報(bào)錯,程序正常運(yùn)行。
        通過工程目錄下的.map文件,我們也可以獲取內(nèi)存分配的信息,可以借此來驗(yàn)證我們修改的正確性。
注:這樣做可能還存在一個問題,因?yàn)镕LASH1區(qū)的大小非常小,只有31K,按照目前這種做法,中斷函數(shù)代碼、變量初始化的值以及字符串常量都被存儲在FLASH1區(qū),部分執(zhí)行代碼也存在這個區(qū)域。如果前面三者的大小超過了FLASH1區(qū)的大小,這種情況不知道編譯器是否會有提示。如果沒有提示,但是溢出的話,可能是會出問題的。但是從目前調(diào)試的情況來看,一切正常。如果后續(xù)出現(xiàn)奇怪的現(xiàn)象,需要考慮是否是這里的問題。
關(guān)閉窗口

相關(guān)文章