[牛人杂谈] 菜鸟详解iar的icf文件

[复制链接]
2623|12
 楼主| 21mengnan 发表于 2019-1-25 15:41 | 显示全部楼层 |阅读模式
每个芯片开发商都会针对每款芯片来编写一个.icf文件就是传说中的链接文件。对于基本的应用,这个.icf文件足以满足你的工程需要。但有时也会需要改动,比如当你的项目要添加外部RAM时就要修改一下icf。

1、Icf到底干了啥呢?
定义了芯片存储空间的大小。
定义ROM的大小和起始、结束地址。
定义RAM的大小和起始、结束地址。
当然这些都是最基本的,你也可以设置以下的东西来匹配你的具体项目。

链接时是否保存位块与符号
设置你的启动过程
设置你的堆与栈的大小和对齐方式
修改编译器默认的初始化过程。
关于默认库的处理等。。。


 楼主| 21mengnan 发表于 2019-1-25 15:43 | 显示全部楼层
2、下面我简单介绍几个功能,详细请参考 EWARM_DevelopmentGuide

2.1  添加额外的region
   比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.


       define region ROM = Mem:[from 0x80000 size 0x100];



2.2 教你怎样放置SECTION
如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:



define region CONST_region = Mem:[from 0x100 size 0x100];



place in CONST_region{readonly section .rodata}



2.3 把一个段放置在指定位置
    place at address Mem:[0]  {readonly section .intvec} //--将向量表放置在地址0处。



999935c4abdfd649b9.png

424225c4abdf06f480.png
Note:之前在看启动代码时,老在想这个向量表示怎么放到地址0处的呢,查了一下reference

    __vector_table是编译器专有字符,表示出处开始放置向量表。

在代码开始处就声明了此段为.intvec。链接的时候在依据icf把它放到地址0处。

936655c4abddce9690.png


2.4 将需要从RAM中运行的代码搬到RAM中
   Initialize by copy {section .textrw}


二、下面是我对generic_cortex.icf的注解



58145c4abdd21aa72.png

 楼主| 21mengnan 发表于 2019-1-25 15:43 | 显示全部楼层
三、总结

咋看一下,这些东西对我们实际编程没有太大作用,有的同学可能学了许久的单片机了也没接触到这个icf(我就是),但是个人觉得,这对于我们理解单片机有很大的帮助。不然的话,对于单片机的理解就简单停留在外设操作了。
xinpian101 发表于 2019-1-25 16:41 | 显示全部楼层
这个必须选对。跟那个Keil的启动文件类似。
643757107 发表于 2019-1-25 21:37 | 显示全部楼层
这个用错了,那就麻烦的很。
玛尼玛尼哄 发表于 2019-1-25 22:22 | 显示全部楼层
DCD是什么指令
捉虫天师 发表于 2019-1-27 13:52 | 显示全部楼层
是的,这个不能选错了。
yiy 发表于 2019-1-27 23:35 | 显示全部楼层
对,这个文件必须选对,不同的单片机,内部不同。
wanduzi 发表于 2019-1-29 20:30 | 显示全部楼层
定义了地址。
mintspring 发表于 2019-2-22 23:51 来自手机 | 显示全部楼层
猛男分享的好
天灵灵地灵灵 发表于 2019-2-23 20:04 | 显示全部楼层
用这个可以修改高级用法。
小明的同学 发表于 2019-2-24 09:15 | 显示全部楼层
一般使用默认的就行了,我很少修改这个。
小明的同学 发表于 2019-2-24 09:15 | 显示全部楼层
不太懂那些修改这个的人是出于何种目的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

1151

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部