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