1. 程式人生 > >嵌入式程式設計第三篇:MDK中連結指令碼解析

嵌入式程式設計第三篇:MDK中連結指令碼解析

     微控制器程式設計使用 MDK時不可避免的要涉及到連結指令碼檔案。在連結指令碼中可以指定程式碼的儲存佈局,可以將程式碼段、只讀資料段、可讀寫的資料段分別存放,也可以精確地指定程式碼放置的位置。

     在瞭解連結指令碼之前需要了解以下概念:

1)RO(ReadOnly):表示程式中的指令和常量;

2)RW(Read/Write):表示程式中已初始化的變數;

3)ZI(Zero):表示程式中未初始化的變數;

4)連結指令碼,也叫程式載入檔案,它決定在生成image檔案時如何來分配相關資料的存放基址。

5)映象檔案(Image),編譯keil中的工程專案時生成的目標檔案時叫做映象檔案(Image)或bin檔案,image檔案中只包含RO,RW段,這是因為ZI資料段都是零,沒有必要包含,只需要把ZI所在的區域清零即可。

     MDK連結程式使用了兩種方式控制程式的連結,即連結控制命令選項和連結指令碼檔案。當使用連結控制命令選項時,連結器定義了6個段地址描述符。

     這6個描述符可以直接在程式中引用。而在使用連結指令碼檔案後,這6個描述符號沒有了,取而代之的是連結指令碼檔案中的段描述符,格式為:Image段名Base 和Image段名Limit。下面將結合具體的例子說明連結指令碼檔案的使用。

例: 一個載入區域,多個連續的執行區域。

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) ;       

//所有清零資料都連續地放在這個區域。

}

}

上面例子中,載入區域和執行區域的名字是可