xiaoyuhzou1228的個(gè)人空間 http://selenalain.com/space-uid-139997.html [收藏] [復制] [RSS]

博客

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

熱度 8已有 1689 次閱讀2019-9-12 09:33

單片機編程使用 MDK時(shí)不可避免的要涉及到鏈接腳本文件。在鏈接腳本中可以指定代碼的存儲布局,可以將代碼段、只讀數據段、可讀寫(xiě)的數據段分別存放,可以精確地指定代碼放置的位置。

在了解鏈接腳本之前需要了解以下概念:1RO(ReadOnly):表示程序中的指令和常量;2RW(Read/Write):表示程序中已初始化的變量;3ZI(Zero):表示程序中未初始化的變量;4鏈接腳本,也叫程序加載文件,它決定在生成image文件時(shí)如何來(lái)分配相關(guān)數據的存放基址。

5鏡像文件(Image),編譯keil中的工程項目時(shí)生成的目標文件時(shí)叫做鏡像文件(Image)bin文件,image文件中只包含RO,RW段,這是因為ZI數據段都是零,沒(méi)有必要包含,只需要把ZI所在的區域清零即可。

  MDK鏈接程序使用了兩種方式控制程序的鏈接,即鏈接控制命令選項和鏈接腳本文件。當使用鏈接控制命令選項時(shí),鏈接器定義了6個(gè)段地址描述符。

6個(gè)描述符可以直接在程序中引用。而在使用鏈接腳本文件后,這6個(gè)描述符號沒(méi)有了,取而代之的是鏈接腳本文件中的段描述符,格式為:Image段名Base Image段名Limit。下面將結合具體的例子說(shuō)明鏈接腳本文件的使用。

 一個(gè)加載區域,多個(gè)連續的執行區域。

STAR 0x00000000 0x00040000;

//定義載入區域STAR ,域基址:0x00000000,域大小為 0x00040000,對應實(shí)際 Flash //的大小。

{

STAR _RO 0x00000000 0x00040000;

//定義一個(gè)運行時(shí)域,第一個(gè)運行時(shí)域必須和加載時(shí)域起始地址相同,否則庫不能加  //載到該時(shí)域的; 錯誤,其域大小一般也和加載時(shí)域大小相同。

*.o (RESET, +First);

// RESET 段最先加載到本域的起始地址外,即RESET 的起始地址為 0,RESET 存儲  //的是向量表。

* (+RO) ;                 

//加載所有匹配目標文件的只讀屬性數據

}

STAR _RW 0x004000 ;

//可讀寫(xiě)數據段STAR _RW緊接STAR _RO段的尾地址存放,即0x040000 + STAR _RO  //容量。

{

* (+RW);      

//加載所有匹配目標文件的可讀寫(xiě)屬性數據

}

STAR _ZI +0 ;   

//清零數據段STAR _ZI緊接STAR _RW段的尾地址存放。

{

* (+ZI) ;       

//所有清零數據都連續地放在這個(gè)區域。

}

}

上面例子中,載入區域和執行區域的名字是可以任意命名的。

發(fā)表評論 評論 (16 個(gè)評論)

回復 kessy1 2019-9-17 15:34
不知道在鏈接腳本中指定代碼的存儲布局和精確地指定代碼放置的位置哪個(gè)更安全?
回復 miniminimini 2019-9-17 18:09
在鏈接腳本中指定代碼的存儲布局和精確地指定代碼放置的位置這兩個(gè)是一樣的概念,沒(méi)有說(shuō)哪個(gè)會(huì )安全
回復 zntsbkhhh 2019-9-18 09:22
這篇文章寫(xiě)的很詳細很具體,已經(jīng)轉發(fā)給我們的技術(shù),后續仔細研究下
回復 tyl20100 2019-9-18 19:30
我弱弱的問(wèn)一下樓主,文章中所說(shuō)的鏈接腳本去哪兒下載呀?是通用版嗎?還有對操作環(huán)境有要求沒(méi)有?
回復 QL87 2019-9-19 07:00
好復雜啊,學(xué)習了。有時(shí)間嘗試驗證一下看看效果。
回復 wang0327 2019-9-19 18:10
理論和舉例相結合,使這篇文章更通俗易懂了,不錯!
回復 Test_wf 2019-9-19 19:08
MDK鏈接程序使用兩種方式控制程序的鏈接,但在實(shí)際運用過(guò)程中兩種方式選擇哪種更簡(jiǎn)便快速操作呢?
回復 kessy1 2019-9-19 20:40
樓主寫(xiě)的示例和原理描述得很詳細,進(jìn)一步了解到MDK中數據存放的方法,收藏了,謝謝!
回復 miniminimini 2019-9-20 09:05
keil和MDK有什么區別?感覺(jué)MDK用于STM32、ARM等嵌入式編程,keil用于單片機編程,用的同學(xué)交流一下,長(cháng)長(cháng)見(jiàn)識
回復 xiaoyuhzou1228 2019-9-20 09:15
KEIL是公司品牌吧,MDK、KEIL C51、KEIL C166、KEIL C251都是KEIL的產(chǎn)品吧
KEIL系列是基于uVision IDE支持各種微控制器開(kāi)發(fā)工具,MDK即KEIL MDK、RealView MDK或者KEIL For ARM,ARM公司現在統一使用MDK-ARM的稱(chēng)呼,MDK的設備數據庫中有很多廠(chǎng)商的芯片,是專(zhuān)為微控制器開(kāi)發(fā)的工具,為滿(mǎn)足基于MCU進(jìn)行嵌入式軟件開(kāi)發(fā)的工程師需求而設計,支持ARM7,ARM9,Cortex-M3/M1,Cortex-R0/R4等ARM微控制器內核。
回復 zntsbkhhh 2019-9-20 10:00
MDK-ARM軟件為基于Cortex-M、Cortex-R4、ARM7、ARM9處理器設備提供了一個(gè)完整的開(kāi)發(fā)環(huán)境。 MDK-ARM專(zhuān)為微控制器應用而設計,而且功能強大,能夠滿(mǎn)足大多數苛刻的嵌入式應用
回復 tyl20100 2019-9-21 06:50
文章寫(xiě)的太短了,應該詳細描述一下這兩種鏈接方式。
回復 QL87 2019-9-21 17:29
用IAR或CodeWarrior軟件該怎么設置鏈接方式呢
回復 Test_wf 2019-9-21 18:10
有誰(shuí)懂的,介紹下吧,我以前有個(gè)項目也得用IAR編譯器,最后沒(méi)弄出來(lái),不了了之了
回復 wang0327 2019-9-22 18:28
當然不能任意了,肯定要看你是用芯片程序的起始地址是多少
回復 shijianguo 2019-9-23 12:32
我對這個(gè)技術(shù)很感興趣,我會(huì )一直關(guān)注的

facelist

您需要登錄后才可以評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
返回頂部
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页