icf文件,链接配置文件

2023-12-07 05:30
文章标签 配置文件 链接 icf

本文主要是介绍icf文件,链接配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

icf是链接配置文件(Linker configuration file)后缀名。

 

stm32固件库中存放路径为:

STM32F0xx_StdPeriph_Lib_V1.5.0\Projects\STM32F0xx_StdPeriph_Templates\EWARM\

如下图所示:;

文件配置内容有:

  • ROM地址空间、大小和sections
  • RAM地址空间、大小和sections
  • 中断向量表地址空间
  • 堆地址空间和大小
  • 栈地址空间和大小

举例如下:

  • ROM地址空间、大小和sections
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
    define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;

     

  • RAM地址空间、大小和sections
    define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
    define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;

     

  • 中断向量表地址空间
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08000000;

     

  • 堆地址空间和大小
    define symbol __ICFEDIT_size_heap__   = 0x100;

     

  • 栈地址空间和大小
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__ = 0x200;

    以上几部分本来由ICF editor编辑的,在代码中也有禁止编辑的提示,完整代码如下:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x200;
define symbol __ICFEDIT_size_heap__   = 0x100;
/**** End of ICF editor section. ###ICF###*/

这些起始、结束地址、大小也可以在IAR工程中进行配置,配置地方如下截图:

对于每个芯片器件,iar有默认的icf目录对应每一种器件,但是可以由用户自行配置,勾选Override default之后即可覆盖默认icf文件。

  • 默认icf配置文件如下截图所示:

配置不同数据块有大有小,由小到大为sectionblock、region 。

将section放在block里,将block放在region里。

以下region配置代码ROM和RAM的大小:

define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

以下block配置代码定义了堆和栈的大小:

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

以下代码定义了region的读写属性,以及包含的block,ROM为只读,RAM为读写并包含CSTACK和HEAP:

place in ROM_region   { readonly };
place in RAM_region   { readwrite, block CSTACK, block HEAP };

IAR链接过程

1、链接需要的文件

2、完成RAM中的代码和变量的初始化。初始化指令可以让链接器产生额外的代码能够copy ROM中的内容到RAM中。每个通过copy完成初始化的段被分成了两个段,一个在ROM,一个在RAM。如果没有人工初始化的话。链接器回自动产生启动代码来完成初始化。

3、通过 icf文件的段放置指令来决定每个section存放的位置。

4、生成最终的包含可执行映像和调试信息的最终文件。

5、最后生成map文件,包括了各个section的的在存储器中的最终地址,global symbol的地址和用到的存储器和库汇总。

完整icf文件注释,以stm32f051_flash.icf为例

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" *//*-Specials-*/
/* 符号常量定义,定义中断向量表地址 */
define symbol __ICFEDIT_intvec_start__ = 0x08000000;/*-Memory Regions-*/
/* 符号常量定义,ROM和RAM的起始结束地址 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20001FFF;/*-Sizes-*/
/* 符号常量定义,定义栈和堆的大小 */
define symbol __ICFEDIT_size_cstack__ = 0x200;
define symbol __ICFEDIT_size_heap__   = 0x100;
/**** End of ICF editor section. ###ICF###*//* 定义可编址的存储空间 */
define memory mem with size = 4G;/* 定义ROM region和RAM region */
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];/* 导出符号常量,在.c .h源文件中可使用 */
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;/* 定义栈block和堆block的大小,8字节对齐 */
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };/* section处理,RW类型数据复制到RAM中,即启动时数据初始化 */
initialize by copy { readwrite };/* .noinit类型的section不需要初始化  */
do not initialize  { section .noinit };/* 定义中断向量表地址及属性,属于section,只读,放在ROM中,需要初始化 */
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };/* 定义ROM_region region只读,放在ROM中 */
place in ROM_region   { readonly };/* 定义RAM_region,读写属性,放在RAM中,包括block CSTACK和block HEAP */
place in RAM_region   { readwrite, block CSTACK, block HEAP };

添加额外的region

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

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

  • 放置section

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

place in CONST_region{readonly section .rodata}

/* 这段语句相当于一个标志位,使的以 ILOADER  声明的代码放在如下空间内,具体声明方式如下:
#pragma location = "ILOADER"
__root const unsigned char RBL_Code[] = {
  0x00, 0x04, 0x00, 0x20, 0x85, 0x2C, 0x00, 0x08, 0x9D, 0x2C, 0x00, 0x08, 0x9F, 0x2C, 0x00, 0x08,
  0xA1, 0x2C, 0x00, 0x08, 0xA3, 0x2C, 0x00, 0x08, 0xA5, 0x2C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x2C, 0x00, 0x08,
};
*/
define region ILOADER_region         = mem:[from 0x08000000 to 0x08003FFF];      
place in ILOADER_region         { readonly section ILOADER };

 

这篇关于icf文件,链接配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464654

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

短链接算法原理

平时我们在上网的时候,印象最深刻的有一次是短链接的服务。例如:平时在微信上看一个网页的时候,如果我们选择在浏览器打开的时候,会看到很长的URL,我们分享的时候,会看到一个很短URL,这就是本次所说的短链接的应用之一。 长链接示例:https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA==&mid=2653355437&idx=1&sn=5901826ea63

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

编译和链接那点事下

http://www.0xffffff.org/?p=357 上回书我们说到了链接以前,今天我们来研究最后的链接问题。         链接这个话题延伸之后完全可以跑到九霄云外去,为了避免本文牵扯到过多的话题导致言之泛泛,我们先设定本文涉及的范围。我们今天讨论只链接进行的大致步骤及其规则、静态链接库与动态链接库的创建和使用这两大块的问题。至于可执行文件的加载、可执行文件的运行时

编译和链接那点事上

http://www.0xffffff.org/?p=323  有位学弟想让我说说编译和链接的简单过程,我觉得几句话简单说的话也没什么意思,索性写篇博文稍微详细的解释一下吧。其实详细的流程在经典的《Linkers and Loaders》和《深入理解计算机系统》中均有描述,也有国产的诸如《程序员的自我修养——链接、装载与库》等大牛著作。不过,我想大家恐怕很难有足够的时间去研读这些厚如

Centos9 网卡配置文件

1、Centos stream 9 网络介结 Centos以前版本,NetworkManage以ifcfg格式存储网络配置文件在/etc/sysconfig/networkscripts/目录中。但是,Centos steam 9现已弃用ifcfg格式,默认情况下,NetworkManage不再创建此格式的新配置文件。从Centos steam 9开始采用密钥文件格式(基于INI文件),Netw