MSP430FR5969內存分配的問題
cmd文件里的具體內容我就不貼了,大家自己可以看一下。cmd文件主要由兩部分構成,一個是MEMORY{};另一個是SECTIONS{}
本文引用地址:http://cqxgywz.com/article/201611/319189.htm其中MEMORY{}是定義內部所有寄存器及存儲器的地址,在這里大部分內容都是廠家定義好的,一般不能修改。但是咱們今天要改的就是他,當然只能改其中允許該的地方,那就是FRAM的分配問題。根據數據手冊里提供的內存分配情況(如下圖)我們可以得知,59x9的內存從0x0000開始,一直到0x13FFF。對應著這個圖和Cmd文件,我們可以了解內部的地址分配問題,如果做過總線擴展之類的同學肯定對這個不會陌生了,如果沒有見過就需要理解一下。其實也很簡單,就是對應的地址要對應上就可以了。有一些是固定好的不能變,比如各個中斷向量的地址,各個寄存器的地址等。一般能變的就是程序存儲空間和數據空間了,對應到59x9里面就是cmd文件里的三個部分,即RAM :origin = 0x1C00, length = 0x0800
FRAM : origin = 0x4400, length = 0xBB80
FRAM2 : origin = 0x10000,length = 0x4000
其中origin 表示起始地址,length 表示長度
這幾個關鍵的起始地址和長度可以在上表以及msp430FR59xx69xx數據手冊.pdf的21頁22頁找到,這兩頁是中斷向量地址,也就是cmd文件下面的部分了。上面說到地址的和21頁和22頁上的地址是內部規定好的,用戶不能自行改變。看到這里,我想大家應該明白了,其實這個芯片留給用戶的地址有3部分。分別是0x1C00開始的2K空間,0x4400開始的46K空間以及0x100000開始的16K空間。那么這些空間都是放什么內容的呢?這就要說到CMD文件中的另一部分SECTIONS{}了。
顧名思義,SECTIONS就是選擇的意思,當然就是選擇程序編譯過程中的每一部分數據的位置了。這一部分每一行的具體意義我也說不太明白。只是略知一二,與此帖有關的的有這樣幾句
- .cinit : {}> FRAM /* INITIALIZATION TABLES */
- .pinit : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .init_array : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .mspabi.exidx : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .mspabi.extab : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .const : {} >> FRAM | FRAM2/* CONSTANT DATA */
- .text:_isr : {}> FRAM /* CODE ISRs */
- .text : {} >> FRAM2 | FRAM/* CODE
- .bss : {} > RAM /* GLOBAL & STATIC VARS */
- .data : {} > RAM /* GLOBAL & STATIC VARS */
- .TI.noinit: {} > RAM /* For #pragma NOINIT */
- .stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STACK */
除了上面那樣利用官方分好的區塊重新定義之外,我們還可以自己重新劃分地址。比如把46K的區塊劃分成兩個或者多個區塊,當然一般為了實用方便區塊還是少一些比較好,把同一類型數據中的子類數據的地址分配權利給編譯器會更簡單一些,如果對數據的存放比較關心,比如我想單獨拿出一塊放參數,那么我們就可以單獨定義一塊地址作為參數,方便數據的管理。

從上圖中,我們可以看到,字符串常量存儲的位置上FLASH1區或者FLASH2區,可執行代碼也是存儲在FLASH1去或者FLASH2區。這里出現這個問題的原因可能是可執行代碼存儲在FLASH區,但是需要的字符串常量存在是FLASH2區,所以重定向時,由于存儲的位置較遠,導致無法定向到。
注:這樣做可能還存在一個問題,因為FLASH1區的大小非常小,只有31K,按照目前這種做法,中斷函數代碼、變量初始化的值以及字符串常量都被存儲在FLASH1區,部分執行代碼也存在這個區域。如果前面三者的大小超過了FLASH1區的大小,這種情況不知道編譯器是否會有提示。如果沒有提示,但是溢出的話,可能是會出問題的。但是從目前調試的情況來看,一切正常。如果后續出現奇怪的現象,需要考慮是否是這里的問題。


評論