單片機編程使用 MDK時不可避免的要涉及到連接腳本文件。在連接腳本中能夠指定代碼的存儲佈局,能夠將代碼段、只讀數據段、可讀寫的數據段分別存放,也能夠精確地指定代碼放置的位置。編程
在瞭解連接腳本以前須要瞭解如下概念:佈局
1)RO(ReadOnly):表示程序中的指令和常量;spa
2)RW(Read/Write):表示程序中已初始化的變量;it
3)ZI(Zero):表示程序中未初始化的變量;編譯
4)連接腳本,也叫程序加載文件,它決定在生成image文件時如何來分配相關數據的存放基址。變量
5)鏡像文件(Image),編譯keil中的工程項目時生成的目標文件時叫作鏡像文件(Image)或bin文件,image文件中只包含RO,RW段,這是由於ZI數據段都是零,沒有必要包含,只須要把ZI所在的區域清零便可。引用
MDK連接程序使用了兩種方式控制程序的連接,即連接控制命令選項和連接腳本文件。當使用連接控制命令選項時,連接器定義了6個段地址描述符。程序
這6個描述符能夠直接在程序中引用。而在使用連接腳本文件後,這6個描述符號沒有了,取而代之的是連接腳本文件中的段描述符,格式爲:Image段名Base 和Image段名Limit。下面將結合具體的例子說明連接腳本文件的使用。im
例: 一個加載區域,多個連續的執行區域。命名
STAR 0x00000000 0x00040000;
//定義載入區域STAR ,域基址:0x00000000,域大小爲 0x00040000,對應實際 Flash //的大小。
{
STAR _RO 0x00000000 0x00040000;
//定義一個運行時域,第一個運行時域必須和加載時域起始地址相同,不然庫不能加 //載到該時域的; 錯誤,其域大小通常也和加載時域大小相同。
*.o (RESET, +First);
//將 RESET 段最早加載到本域的起始地址外,即RESET 的起始地址爲 0,RESET 存儲 //的是向量表。
* (+RO) ;
//加載全部匹配目標文件的只讀屬性數據
}
STAR _RW 0x004000 ;
//可讀寫數據段STAR _RW緊接STAR _RO段的尾地址存放,即0x040000 + STAR _RO的 //容量。
{
* (+RW);
//加載全部匹配目標文件的可讀寫屬性數據
}
STAR _ZI +0 ;
//清零數據段STAR _ZI緊接STAR _RW段的尾地址存放。
{
* (+ZI) ;
//全部清零數據都連續地放在這個區域。
}
}
上面例子中,載入區域和執行區域的名字是能夠任意命名的。