當前所在位置:首頁 > 關于我們 > 資訊中心

嵌入式編程第三篇:MDK中鏈接腳本解析

發布時間:2019-09-10

       單片機編程使用 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) ;      
//所有清零數據都連續地放在這個區域。
}
}
       上面例子中,載入區域和執行區域的名字是可以任意命名的。
上一篇:批量個人化燒錄工具LKT-CCloader 下一篇:NVM區數據備份機制(二)
包邮是什么意思