MDK编译过程和文件类型

MDK是一款IDE软件,具有,编辑,编译,链接,下载,调试等等的功能。

1.编译器介绍: MDK可以编译C/C++文件和汇编文件,MDK只是一款IDE软件,那他内部使用的是什么编译器呢?我们打开MDK安装目录,在\ARM\ARMCC\bin文件夹下包含armasm.exe和armcc.exe两个文件,前者用来编译汇编代码,后者用来编译C代码。他们的主要作用是编译源代码得到机器码,生成以.o为后缀的对象文件。.o文件包含代码,数据,和调试信息。注意:工程中的每个源文件(.c文件或.s文件)经过编译后生成一个对应的.o文件。
2.链接器介绍:MDK使用的链接器是armlink,armlink和编译器在同一级目录下,链接器armlink把各个.o文件以及库文件链接最终生成一个映像文件(.axf文件或.elf文件)。注意:是把工程中各个.o文件最终链接成一个.axf文件或.elf文件。
3.格式转换器介绍:链接以后得到了.axf文件或.elf文件。使用转换工具fromelf将.axf文件或.elf文件转换为hex文件或bin。转换器fromelf和编译器连接器在同一级目录下。
我们随便找一个MDK工程编译一下,整个编译过程如下图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们最最最关心的就是 链接以后Programma Size:这一行的输出了。
下面分别介绍
Code,RO-data,RW-data,ZI-data

Code:编译器编译以后生产的机器指令。这些指令占用ROM空间,存储在ROM区。
RO-data: read only data的简写,是只读数据,程序运行的时候只能读取,不能修改。就是平时说的常量了。因为不需要修改,所以编译器干脆就把他们分配到ROM空间,所以说 RO-data占用ROM空间,存储在ROM区。
RW-data:read write data的简写,是可读可写数据,程序运行的时候可以读取也可以修改,就是平时说的变量了,变量占用RAM空间,这里特别注意,只有初始值不为0的变量才分配到RW-data。为什么呢?变量占用RAM空间这一点毫无疑问。大家都知道RAM是随机存储器,RAM的特点是随时可读可写,掉电数据丢失,上电以后初始值是随机数,而我们的需求却是上电以后是一个指定的非0值,怎么办,这不是为难我胖虎吗?办法总比困难多,我们把这些变量保存到ROM区,程序运行的时候再从ROM区复制到RAM区。这样就达到我们的目的了。
ZI-data: zero init data的简写,初始化为0的变量,这就简单了,不像RW-data那么腻歪人,程序运行的时候直接在RAM中分配空间就行。
了解了以上我们貌似就知道我们代码占用多少ROM空间和多少RAM空间了。
占用ROM空间是 Code + RO data + RW data
占用RAM空间是 RW data + ZI data
RW之所以占用两份空间是因为他是初始值为非0的变量,程序运行后需要从ROM空间复制到RAM空间。
可能有的大兄弟写了一个很简单的测试代码,比如LED闪烁灯的代码,明明没有定义那么多变量,编译以后ZI data 却是 1K多或2K的样子,这是为什么呢?
ZI data 包含3部分 ,栈空间 + 堆空间 + 程序员定义的一些初始值为0的全局变量,所以那1K多2K多基本上都是栈空间和堆空间吃掉的。这里注意,如果程序中没有使用malloc动态申请内存,编译器会把堆空间优化掉。比如我刚才打开一个测试例程代码,栈空间分配1K ,堆空间分配512字节,程序中定义了一些全局变量,没有使用malloc动态申请内存,编译以后ZI data是1136字节。如果大兄弟们发现 ZI data小于堆空间+栈空间的时候不要大惊小怪,可能是你没有使用malloc,编译器帮你优化掉了堆空间。

MDK工程编译以后会产生大量的中间文件,这些文件在调试程序阶段是非常重要的甚至是必不可少的,当我们调试完毕以后,把工程保存到电脑硬盘或网盘上,此时我们希望整个工程占用较小的存储空间。整个工程包含源文件,工程文件,中间文件,目标文件等等。源文件,工程文件肯定不能删除,我们只能删除掉中间文件或目标文件,怎么删除呢?手动删除?辣么多文件,手动删除不仅慢而且容易出错。我们编写一个脚本来删除。
因为这个脚本只是来删除一些文件,我们只用到一个del命令。
del jack.txt 删除jack.txt 文件
del *.txt /s删除所有子目录下所有的**.txt**文件,也就是递归删除。我们用到的就是这个这行命令。
在windows命令行中输入 **del /?**可以查看del的用法。
接下来我们动手写一个删除中间文件的脚本
新建一个后缀为.bat的文件,编辑内容如下
del *.bak /s
del *.ddk /s
del *.edk /s
del *.lst /s
exit
在这里插入图片描述

删除所有子目录后缀为.bak的文件。
删除所有子目录后缀为.ddk的文件。
删除所有子目录后缀为.edk的文件。
删除所有子目录后缀为.lst的文件。
最后执行exit命令退出命令行。
如果需要删除其他文件可以仿照着写。

编写指令生成bin文件。
生成bin文件要依靠fromelf工具。
MDK生成bin文件不能像生成hex文件那么简单了,需要在options选项卡下user选项中输入命令。

fromelf需要根据工程的.axf文件转换得到bin文件,工程构建完成以后生成了axf文件,所以命令要输入到 After Build/Rebuild一栏中。
例子指令:
fromelf --bin --output …\Output\jack.bin …\Output\application.axf
fromelf --bin --output 是固定的,前边的路径是输出路径,后边的路径是输入路径。
指令路径该如何写,这需要理解,因工程而异。
指令的路径是以.uvprojx工程文件为中心去找输入文件和输出文件。在Windows中…表示上一级目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python-折线图可视化

折线图可视化 1.JSON数据格式2.pyecharts模块介绍3.pyecharts快速入门4.创建折线图 1.JSON数据格式 1.1什么是JSON JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符串 1.2主要功能json就是一种在各个编程语言中流…

JavaSE第7篇:封装

文章目录 一、封装1、好处:2、使用 二、四种权限修饰符三、构造器1、作用2、说明3、属性赋值的过程 一、封装 封装就是将类的属性私有化,提供公有的方法访问私有属性 不对外暴露打的私有的方法 单例模式 1、好处: 1.只能通过规定的方法来访问数据 2.隐藏类的实例细节,方便…

CSS篇之圆角梯形

附上一篇文章&#xff1a;梯形tab按钮-基于clip-path path函数实现 - JSRUN.NET 他这个区别在于&#xff0c;收尾两侧都是直角的&#xff0c;如图 下面这个是圆角&#xff1a; 思路&#xff1a; 代码如下&#xff1a; <template><div class"wrap"><…

时序数据库选型TimescaleDB

最近要做一个数字车间的物联网项目&#xff0c;数据存储成了首先要解决的问题&#xff0c;整个车间一共104台数控机床&#xff0c;1s钟采集1次数据&#xff0c;360024365*1043,279,744,000 &#xff0c;一年要产生32亿条记录&#xff0c;这个数据量用常见的关系型数据库肯定是不…

【C语言加油站】qsort函数的模拟实现

qsort函数的模拟实现 导言一、回调函数二、冒泡排序2.1 冒泡排序实现升序 三、qsort函数3.1 qsort函数的使用3.2 比较函数 四、通过冒泡排序模拟实现qsort函数4.1 任务需求4.2 函数参数4.3 函数定义与声明4.4 函数实现4.4.1 函数主体4.4.2 比较函数4.4.3 元素交换 4.5 my_qsort…

Mrdoc知识文档

MrDoc知识文档平台是一款基于Python开发的在线文档系统&#xff0c;适合作为个人和中小型团队的私有云文档、云笔记和知识管理工具&#xff0c;致力于成为优秀的私有化在线文档部署方案。我现在主要把markdown笔记放在上面&#xff0c;因为平时老是需要查询一些知识点&#xff…

mysql使用st_distance_sphere函数报错Incorrect arguments to st_distance_sphere

前言 最近使用空间点位查询数据时函数报错Incorrect arguments to st_distance_sphere报错。 发现问题 因为之前是没有问题的&#xff0c;所以把问题指向了数据&#xff0c;因为是外部数据&#xff0c;不是通过系统打点获取&#xff0c;发现是因为经纬度反了&#xff0c;loc…

软件测试指南

软件测试指南 软件集成测试软件系统测试&#xff08;功能性测试&#xff0c;性能测试&#xff09;

事件监听的艺术:掌握`addEventListener`的魅力

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

实现前端指纹登录的简单示例

随笔 一切的失败都来源于实力不足 引入 如今的指纹识别已经充分运用到平板、笔记本电脑、手机甚至在用户支付中也是大有造诣&#xff0c;所以指纹作为我们用户独属于自己的身份识别信号也是相当重要的&#xff0c;正是这种独特的身份信号保存着我们的隐私信息 在现代网页应…

【Vulnhub 靶场】【IA: Keyring (1.0.1)】【中等】【20210730】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/ia-keyring-101,718/ 靶场下载&#xff1a;https://download.vulnhub.com/ia/keyring-v1.01.ova 靶场难度&#xff1a;中等 发布日期&#xff1a;2021年07月30日 文件大小&#xff1a;1.1 GB 靶场作者&#xf…

基于Mamdani模糊神经网络的调速控制系统simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 模糊神经网络控制器概述 4.2 模糊神经网络控制器基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................…

Linux与常用的Linux命令

Linux概念 Linux 是一种免费使用和自由传播的类 UNIX 操作系统。它的内核最初是由芬兰计算机科学家林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;在 1991 年发布&#xff0c;并持续发展至今。Linux 的设计灵感来源于 MINIX 和 Unix 系统&#xff0c…

UE5 项目设置

1、定义设置哪些参数 UCLASS(configEngine, globaluserconfig) class ADVMOD_API UGlobalSettings : public UObject {GENERATED_BODY()public:UGlobalSettings();const FString& GetPythonExePath() const { return PythonExePath.FilePath; }private:UPROPERTY(config, E…

【SpringBoot零基础入门到项目实战①】解锁现代Java开发之门:深度探究Spring Boot的背景、目标及选择理由

文章目录 引言Spring Boot的背景和目标背景目标 为什么选择Spring Boot1. 简化配置2. 内嵌式容器3. 生态系统支持4. 大量的Starter5. 广泛的社区支持6. 适用于微服务架构7. 丰富的扩展机制 实例演示创建一个简单的Spring Boot应用 拓展与深入学习1. Spring Boot Actuator2. Spr…

程序设计原则

▶1.程序设计的基本原则 程序设计中哪些因素很重要&#xff0c;不同专家有不同看法&#xff0c;专家们都有直己独到的见解。有人认为程序的清晰性很重要&#xff1b;有人认为程序的执行效率要优先考虑&#xff1b;有人认为程序的正确性是头等大事&#xff1a;有些人认为这些都…

EtherCAT主站SOEM -- 10 -- SOEM之基于QT搭建自己的EtherCAT主站

EtherCAT主站SOEM -- 2 -- SOEM之ethercatbase.h/c文件解析 0 QT-SOEM视频预览:一 SOEM主站解析:1.1 调用ec_init(eth0) 函数:1.1.1 执行到 nicdrv.c 文件 (网络接口卡(NIC)驱动程序)1.1.1.1 ecx_setupnic函数1.1.1.2 ecx_setupnic函数解析1.1.1.3 ec_setupheader(void …

word如何快速制作简易代码块

先上解决方案。 方式一&#xff08;全自动&#xff09;&#xff1a; typora编辑&#xff0c;导出选择word文档即可。内网环境&#xff0c;故放弃。 方式二&#xff08;全手动&#xff09;&#xff1a; 在修改文档时&#xff0c;左侧会有“段落布局”按钮&#xff0c;点击该按…

力扣刷题-二叉树-路径总和

112 路径总和 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 返回 true, 因为…

记录 | Visual Studio报错:const char*类型的值不能用于初始化char*类型

Visual Studio 报错&#xff1a; const char *”类型的值不能用于初始化“char *”类型的实体错误 解决办法&#xff1a; 1&#xff0c;强制类型转换&#xff0c;例如&#xff1a; char * Singer::pv[] {(char*)"other", (char*)"alto", (char*)"c…