• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

嵌入式编程第三篇:MDK中链接脚本解析

单片机编程使用MDK时不可避免的要涉及到链接脚本文件。在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,也可以精确地zhiding代码放置的位置。

在了解链接脚本之前需要了解以下概念:1)RO(ReadOnly):表示程序中的指ling和常量;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) ;       

//所有清零数据都连续地放在这个区域。

}

}

上面例子中,载入区域和执行区域的名字是可以任意命名的。

全部回复(16)
正序查看
倒序查看
邓女士
LV.5
2
2019-09-17 15:37
不知道在链接脚本中指定代码的存储布局和精确地指定代码放置的位置哪个更安全?
0
回复
2019-09-17 18:16
这两个概念是一样的,没有谁更加安全一说
0
回复
zntsbkhhh
LV.2
4
2019-09-18 09:38
@miniminimini
这两个概念是一样的,没有谁更加安全一说
文章写的很详细很具体,已经转发给我们的技术,后续仔细研究下
0
回复
2019-09-18 19:31
@zntsbkhhh
文章写的很详细很具体,已经转发给我们的技术,后续仔细研究下
我弱弱的问一下楼主,文章中所说的链接脚本去哪儿下载呀?是通用版吗?还有对操作环境有要求没有啊?
0
回复
BLoun
LV.5
6
2019-09-19 07:04
@胖爷阿戈
我弱弱的问一下楼主,文章中所说的链接脚本去哪儿下载呀?是通用版吗?还有对操作环境有要求没有啊?
好复杂啊,学习了。有时间尝试验证一下看看效果。
0
回复
114W1
LV.5
7
2019-09-19 18:11
@BLoun
好复杂啊,学习了。有时间尝试验证一下看看效果。
理论和举例相结合,使这篇文章更通俗易懂了,不错!
0
回复
Hex315
LV.5
8
2019-09-19 19:10
@114W1
理论和举例相结合,使这篇文章更通俗易懂了,不错!
MDK链接程序使用两种方式控制程序的链接,但在实际运用过程中两种方式选择哪种更简便快速操作呢? 
0
回复
邓女士
LV.5
9
2019-09-19 20:49
楼主写的示例和原理描述得很详细,进一步了解到MDK中数据存放的方法,收藏了,谢谢!
0
回复
2019-09-20 09:09
Keil和MDK啥区别?感觉MDK用于STM和ARM等,keil用于单片机???这么理解对吗?有没有懂的人
0
回复
宇宙王
LV.3
11
2019-09-20 09:18
@miniminimini
Keil和MDK啥区别?感觉MDK用于STM和ARM等,keil用于单片机???这么理解对吗?有没有懂的人
KEIL是公司品牌吧,MDK、KEIL C51、KEIL C166、KEIL C251都是KEIL的产品吧KEIL系列是基于uVision IDE支持各种微控制器开发工具,MDK即KEIL MDK、RealView MDK或者KEIL For ARM,ARM公司现在统一使用MDK-ARM的称呼,MDK的设备数据库中有很多厂商的芯片,是专为微控制器开发的工具,为满足基于MCU进行嵌入式软件开发的工程师需求而设计,支持ARM7,ARM9,Cortex-M3/M1,Cortex-R0/R4等ARM微控制器内核。
0
回复
zntsbkhhh
LV.2
12
2019-09-20 10:12
@宇宙王
KEIL是公司品牌吧,MDK、KEILC51、KEILC166、KEILC251都是KEIL的产品吧KEIL系列是基于uVisionIDE支持各种微控制器开发工具,MDK即KEILMDK、RealViewMDK或者KEILForARM,ARM公司现在统一使用MDK-ARM的称呼,MDK的设备数据库中有很多厂商的芯片,是专为微控制器开发的工具,为满足基于MCU进行嵌入式软件开发的工程师需求而设计,支持ARM7,ARM9,Cortex-M3/M1,Cortex-R0/R4等ARM微控制器内核。
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,而且功能强大,能够满足大多数苛刻的嵌入式应用 
0
回复
BLoun
LV.5
13
2019-09-21 17:30
@zntsbkhhh
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。MDK-ARM专为微控制器应用而设计,而且功能强大,能够满足大多数苛刻的嵌入式应用 
用IAR或CodeWarrior软件该怎么设置链接方式呢
0
回复
Hex315
LV.5
14
2019-09-21 18:08
@BLoun
用IAR或CodeWarrior软件该怎么设置链接方式呢
有谁懂的,介绍下吧,我以前有个项目也得用IAR编译器,最后没弄出来,不了了之了
0
回复
2019-09-21 18:22

文章中定义的STAR 地址 是可以任意设置的吗?

文章中定义的STAR地址是可以任意设置的ma

0
回复
2019-09-21 18:22

文章中定义的STAR 地址 是可以任意设置的吗?

文章中定义的STAR地址是可以任意设置的ma

0
回复
114W1
LV.5
17
2019-09-22 18:29
@123小屁孩
文章中定义的STAR地址是可以任意设置的吗?文章中定义的STAR地址是可以任意设置的ma
当然不能任意了,肯定要看你是用芯片程序的起始地址是多少
0
回复