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中…表示上一级目录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】Java zip解压时候 malformed input off : 4, length : 1

需求:通过页面上传ZIP文件后,对zip文件进行解压。 遇到的错误:在进行zip解压的时候错误如下: 先看报错前的: /*** 解压缩ZIP文件* param zipFile ZIP文件* param destDir 目标路径*/ public static void zipDecompre…

HIVE窗口函数

什么是窗口函数 hive中开窗函数通过over关键字声明;窗口函数,准确地说,函数在窗口中的应用;比如sum函数不仅可在group by后聚合,在可在窗口中应用; hive中groupby算子和开窗over,shuffle的逻辑…

时序数据库选型TimescaleDB

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

phpMyAdmin的常见安装位置

nginx的日志显示有人一直在尝试访问phpMyAdmin的setup.php,用了各种位置。 其实我只有一个nginx,别的什么也没有。 47.99.136.156 - - [01:44:37 0800] "GET http://abc.com:80/phpMyAdmin/scripts/setup.php HTTP/1.0" 404 162 "-"…

新建vue3项目

三种方法 一. 第一种方式 1、操作步骤: 创建项目目录 vue create 项目名称选择配置方式 ? Please pick a preset: #选择一个配置 Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint)Manually select …

wordpress安装之正式开始安装wordpress

1、拉取wordpress镜像 docker pull wordpress 2、启动容器 启动容器,设置容器名为wordpress2并把80端口映射到宿主机的9988端口 docker run -it --name wordpress2 -p 9988:80 -d wordpress 3、查看容器状态 docker ps 4、安装wordpress博客程序 因为我们前面启…

「斗破年番」小医仙黑皇城遭调戏,五品丹换药材,获取菩提涎消息

Hello,小伙伴们,我是拾荒君。 《斗破苍穹年番》的第75集已经更新了,喜欢这部国漫的小伙伴应该都去观看了吧,拾荒君也是看了看这一集。在这一集中,萧炎成功地帮助吴昊等人摆脱了鹰爪老人的围困,然后便前往了黑皇城。 黑…

【JAVA-Day65】Java内部类深度解析

Java内部类深度解析 《Java内部类深度解析》摘要引言一、理解内部类1. 内部类的基本概念和语法1.1 什么是内部类?1.2 内部类的语法结构1.3 内部类的基本概念 2. 不同类型的内部类详解2.1 成员内部类2.2 静态内部类2.3 局部内部类2.4 匿名内部类 二、内部类与普通类的…

FL Studio2024破解版注册机及使用教程

FL Studio 2024破解版是一款非常实用的软件。该软件用于不同的目的,例如从音频中删除人声、管理音频以及更改不同的音频属性。此外,您还可以查看音频和歌曲的不同效果并管理其音量和大小。您还可以管理音乐和音频的自动化。您可以用它创作一首具有不同音…

深入理解——快速排序

目录 💡基本思想 💡基本框架 💡分割方法 ⭐Hoare版本 ⭐挖坑法 ⭐前后指针法 💡优化方法 ⭐三数取中法 ⭐小区间内使用插入排序 💡非递归实现快速排序 💡性能分析 💡基本思想 任取待排…

LeedCode刷题---滑动窗口问题(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、将X减到0的最小操作数 题目链接:将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

函数和函数表达式

我们先来看三个式子 1️⃣ yf(x) 2️⃣ f(x)2x1 3️⃣ y2x1 先来明确一下概念,这三个式子的🟰两边总共有3种表达形式 y是函数最终输出的值f(x) 是整个函数运算过程2x1是具体的表达式 那么这三个式子分别是什么意思呢? yf(x)是对函数关系的…

一个简单的光线追踪渲染器

前言 本文参照自raytracing in one weekend教程,地址为:https://raytracing.github.io/books/RayTracingInOneWeekend.html 什么是光线追踪? 光线追踪模拟现实中的成像原理,通过模拟一条条直线在场景内反射折射,最终…

Cadence SPB17.4做Logo封装及添加中文丝印

Cadence SPB17.4 -Allegro - 做Logo封装及添加中文丝印 Chapter1 Cadence SPB17.4做Logo封装Chapter2 Allegro添加中文字体的简单有效方法Chapter3 Allegro添加Logo方法方法一方法二 Chapter4选择菜单栏Dimension——Create Detail命令对logo进行缩放设置,如下图所示…

【linux--进程通信之共享内存】

目录 一、共享内存的原理二、共享内存的数据结构三、共享内存使用的函数2.1ftok函数2.2shmget函数2.3shmctr函数2.4shmat函数2.5shmdt函数 四、实现进程通信 一、共享内存的原理 共享内存实际是操作系统在实际物理内存中开辟的一段内存。 共享内存实现进程间通信,是…

华为云创新动能涌现,浒墅关开启先进制造新纪元

编辑:阿冒 设计:沐由 穿境而过的京杭大运河,孕育了苏州浒墅关深厚的历史文化底蕴。千年延续不断的繁华,滋养了一代又一代奋进的浒墅关人。今天,一座国家级经开区挺立在这里,散发出创新创业的蓬勃活力。 苏州…

配置本地端口镜像示例

镜像概念 定义 镜像是指将指定源的报文复制一份到目的端口。指定源被称为镜像源,目的端口被称为观察端口,复制的报文被称为镜像报文。 镜像可以在不影响设备对原始报文正常处理的情况下,将其复制一份,并通过观察端口发送给监控…

dysmsapi

dysmsapi DY - SMS - API 短信服务接口 短信服务_SDK中心-阿里云OpenAPI开发者门户 <!-- 阿里dayu sms api短信群发接口 --><!-- https://mvnrepository.com/artifact/com.aliyun/dysmsapi20170525/2.0.24 --><dependency><groupId>com.aliyun&l…

WEB渗透—PHP反序列化(三)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

07用户行为日志数据采集

用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分&am…