MSP430在CCS開發環境下的記憶體分配

2021-07-25 09:02:57 字數 1534 閱讀 2879

用ccs開發環境以及有一年多了,之前寫程式,僅僅是停留在寫程式的階段,從來沒有想過記憶體是如何分配的。這次做這個,由於程式的**量比較大,有40k+,所以在程式整合編譯的過程中,遇到了一些之前沒有遇到過的問題,在查閱了一些資料之後,解決了這些問題,在這裡做一下總結。

首先,我們先丟擲遇到的問題。在將程式整合之後,編譯報錯了,報的錯誤如下圖所示。這個問題是說重定向時,重定向的位址為17位,太大了,超過了16位解碼的範圍。

這裡這個問題我是這樣理解的,是這些函式中需要呼叫一些字串常量(根據錯誤定位得出的結論),這時候需要跳轉到這個常量所在的位址,但是由於這個位址離當前函式所在的位址「太遠了」,所以沒有辦法跳轉到那裡執行。

有了這樣的分析,我們很自然地想到,如果這些字串常量能夠離程式所在的區域「近一些」,那麼這個問題就能解決了。如何來控制字串常量所在的儲存區域呢?這裡我們需要了解一下cmd檔案。

以msp430f6638的cmd檔案為例,它主要包含了兩個資訊。

乙個是關於msp430f6638的記憶體對映資訊,如下圖所示。利用紅色的區域中的資訊,我們也可以計算出,6638的ram是從0x2400開始,大小為16k,usbram是從0x1c00開始,大小為2k,flash分為兩個區域總的大小為256k。

另乙個是關於變數、**等分配的儲存位置。如下如所示。我們需要重點關注的是紅色區域內的資訊。觀察一下。我們不難理解紅色區域內**的含義,是將.bss段、.data段、.sysmem段及.stack段的資訊放在ram區,而.test段等資訊被儲存在flash區。這些段各代表什麼呢?這裡我也做了一下總結,如下如所示。

從上圖中,我們可以看到,字串常量儲存的位置上flash1區或者flash2區,可執行**也是儲存在flash1去或者flash2區。這裡出現這個問題的原因可能是可執行**儲存在flash區,但是需要的字串常量存在是flash2區,所以重定向時,由於儲存的位置較遠,導致無法定向到。

因此,我們考慮修改cmd檔案,使得字串常量全部儲存在flash區。在經過了這樣的修改之後,再編譯時,不再報錯,程式正常執行。

通過工程目錄下的.map檔案,我們也可以獲取記憶體分配的資訊,可以藉此來驗證我們修改的正確性。

注:這樣做可能還存在乙個問題,因為flash1區的大小非常小,只有31k,按照目前這種做法,中斷函式**、變數初始化的值以及字串常量都被儲存在flash1區,部分執行**也存在這個區域。如果前面三者的大小超過了flash1區的大小,這種情況不知道編譯器是否會有提示。如果沒有提示,但是溢位的話,可能是會出問題的。但是從目前除錯的情況來看,一切正常。如果後續出現奇怪的現象,需要考慮是否是這裡的問題。

基於CCS工程MSP430串列埠公升級(一)

第一次接觸msp430的晶元,第一次使用ccs開發環境,花了將近乙個星期的時間,才把msp430串列埠公升級做出來。在lnk msp430fg479.cmd中修改boot flash的起始位址 0xf000 0xffe0 將近4k的flash memory timer a0 interrupt se...

MSP430 開發注意事項要求

以下是在使用msp430中的一些總結 1.系統時鐘問題 系統預設使用dco,使用外部高速晶振xt2時必須自己開啟xt2,並延時50us等待xt2起振,然後手工清除ifg1中的ofifg位 一定要注意操作順序 開啟xt2 等待xt2穩定 切換系統時鐘為xt2 若後面兩步操作反了,在通常情況下不會出現問...

在msp430上使用S 100

屬於msp430的串列埠的應用。s 100輸出資料的方式還有iic和analog voltage output,這裡使用uart。使用器件型號 msp430f169 msp430f149,s 100 co module tcc elt uart protocol的資料格式 其他說明詳見s 100手冊...