认识IAR 开发环境下的.icf 文件和map文件

2023-12-07 05:30
文章标签 开发 认识 环境 map iar icf

本文主要是介绍认识IAR 开发环境下的.icf 文件和map文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IAR 开发环境下使用 .icf文件定义 MCU及其外扩资源的应用范围,这些在项目设计之前必须被确定下来。所以认识它非常重要。那么该文件是如何定义的呢?
下面通过一个.icf来认识其具体结构:
这是一个基于STM32芯片的.icf文件定义结构:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/********************************-Specials-************************************/
/*由于STM32内部flash的起始地址为 0x08000000, 所以如下语句定义程序的起始地址,但对于一个应用程序,其起始运行地址不一定是 芯片定义的初地址,其可根据实际需要修改,当修改后,必须特殊设计一段引导代码使其能跳到应用程序中来。 由于作者的系统的APP 起始地址为 0x08008000 ,所以我的应用程序app start addrress 定义如下:*/
define symbol __ICFEDIT_intvec_start__ = 0x08008000;     
/********************************-Memory Regions-******************************/
/* 定义内部FLASH地址 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08008000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0807FFFF;
/*  定义内部RAM地址 */
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x2000FFFF;

/* 定义扩展RAM地址 */
define symbol __ICFEDIT_region_EXRAM_start__    = 0x68000000;
define symbol __ICFEDIT_region_EXRAM_end__      = 0x68040000;

/*********************************-Sizes-***************************************/
/* 栈和堆大小,一般不需要修改 */
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x200;
/******************************* End of ICF editor section. ###ICF###***********/
define memory mem with size = 4G;
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

/*定义内部 RAM 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__];
define region EXRAM_region = mem:[from __ICFEDIT_region_EXRAM_start__   to __ICFEDIT_region_EXRAM_end__];

/*
********************************************************************************
                    Define Bootloader address 
********************************************************************************
*/
/* 这段语句相当于一个标志位,使的以 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 };
/*******************************************************************************/
/* 下列语句定义所定义地址空间内可完成的操作类型*/
initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };      
/* 对外部RAM操作类型的声明 */                 
place in EXRAM_region {readwrite data section SDRAM };          /* EXTSRAM_region */
/* 定义一个标志位,代表扩展RAM的起始地址,可以再应用函数中直接调用SDRAM_BASE_ADDR 这个变量 */
define exported symbol SDRAM_BASE_ADDR = __ICFEDIT_region_EXRAM_start__;

/******************************* End of this file ******************************/

 

 

 

AR的默认设置是不生成map文件的,我们需要手动设置一下,如下图,然后点击准备就绪之后编译即可在PROJDIR\FLASH_256KB_PFLASH\List文件夹下找到:

生成之后,我们在IAR环境下打开它(当然可以以记事本直接打开,这里为了更直观),map文件主要由以下几部分构成:
(1)文件头中显示链接器版本,输出文件名,MAP 文件名以及链接器命令行等。 
(2)RUNTIME MODEL ATTRIBUTES 部份显示 Endian等属性;
(3) PLACEMENT SUMMARY部份显示各sections 在存储器中的分布; 
(4)INIT TABLE 部份显示与初始化有关的section tables;
(5)MODULE SUMMARY部份显示所有被连接的文件信息,包括目标文件和库文件等;

(6)ENTRY LIST部份给出了所有函数的入口地址及其所在的目标文件。 

(7)文件尾中显示了总的代码和数据字节数(想看下最后目标代码占用多少Flash和多少RAM的可以从这里查到)。

1)PLACEMENTSUMMARY,该部分主要显示目标代码在芯片内部的存储器映射地址,可能会有人疑问为什么会分配到这些地址的呢,其实这些地址分配都是在前文讲的Linker文件(*.icf文件)里预定义好了,IAR根据所选目标芯片就按照该定义分配地址段,然后烧写进Flash

(2)ENTRYLIST,开发工程内所有函数的入口地址,个人觉着这部分很有用,通过该地址映射再结合调试的时候观察内存空间可以方便整个工程执行情况,让你了若指掌,而且也方便你解读一个陌生程序的功能(例如参考别人的例程,网上的例程之类的),总之个人觉着这个部分用处很大,有心人可以在此处做很大文章。

(3)这是map文件末尾部分,最后给出了整个工程文件占用的资源情况,即芯片内部Flash和RAM的使用情况,便于你对工程开发规模上的掌握,最后给出工程编译链接输出信息。

转自:https://blog.csdn.net/gmq_syy/article/details/79627199

这篇关于认识IAR 开发环境下的.icf 文件和map文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装