MDK编译过程和文件类型

news2024/11/27 6:39:03

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.coloradmin.cn/o/1319037.html

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

相关文章

IDEA中,如何将maven项目变为SpringBoot项目?

第一步&#xff1a;新建Maven工程 这很简单不做过多赘述。 第二步&#xff1a;修改pom.xml文件 分别加入springboot父依赖&#xff0c;web依赖&#xff0c;test测试依赖&#xff0c;maven打包依赖。 <?xml version"1.0" encoding"UTF-8"?> <…

【HTML5、CSS3】新增特性总结!

文章目录 23 HTML5 新增特性23.1 语义化标签23.2 多媒体标签23.2.1 视频<video>标签23.2.2 音频<audio>标签 23.3 input属性值23.4 表单属性 24 CSS3 新增特性24.1 属性选择器24.2 结构伪类选择器24.2.1 选择第n个元素24.2.2 常用的6个结构伪类选择器 24.3 伪元素选…

【设计模式-2.4】创建型——抽象工厂模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型设计模式的抽象工厂设计模式&#xff1b; 工厂模式的问题 在【设计模式-2.2】创建型——简单工厂和工厂模式这篇博文中&#xff0c;介绍过飞机大战游戏里&#xff0c;使用简单工厂和工厂模式来创建坦克、飞机、Boss对象…

Pod控制器详解【五】

文章目录 5. Pod控制器详解5.1 Pod控制器介绍5.2 ReplicaSet(RS)5.3 Deployment(Deploy)5.4 Horizontal Pod Autoscaler(HPA)5.5 DaemonSet(DS)5.6 Job5.7 CronJob(CJ) 5. Pod控制器详解 5.1 Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xf…

雷电4.0.50模拟器Android7.1.2安装xposed框架

官方论坛&#xff1a;https://xdaforums.com/t/official-xposed-for-lollipop-marshmallow-nougat-oreo-v90-beta3-2018-01-29.3034811/ Xposed 有分支 [EdXposed 和 LSPosed] 。 Edxposed框架现在支持android 8.0 - android 9.0 &#xff0c;如果是android 7.0或更早的版本&…

【unity小技巧】使用三种方式实现瞄准瞄具放大变焦效果

最终效果对比 文章目录 最终效果对比前言第一种办法方法二1. 创建URP环境2. 配置 Universal Render Pipeline Asset3. 这里向我们新建一个无光的ShaderGraph4. 主图配置4. 新建材质&#xff0c;挂载5. 下面是shaderGraph 的连线图6. 新增脚本控制ObjectScreenPosition随着瞄准镜…

安卓端出现https请求失败(转)

背景# 某天早上&#xff0c;正在一个会议时&#xff0c;突然好几个同事被叫出去了&#xff1b;后面才知道&#xff0c;是有业务同事反馈到领导那里&#xff0c;我们app里面某个功能异常。 具体是这样&#xff0c;我们安卓版本的app是禁止截屏的&#xff08;应该是app里做了拦…

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

呜呜呜我要拿Go赢他~ 入门,Go的最简单的 Web 服务器!

前言 继续接入上章节的呜呜呜我要拿Go赢他~ 入门,Go的基础语法! 的文章现在要学的是Go的最简单的 Web 服务器! 补充 上章节的基础语法-方法声明与调用 方法声明 四个部分&#xff1a; 关键字 func方法名字&#xff1a;首字母是否大写决定了作用域参数列表&#xff1a;返回…

C++面试宝典第6题:访问数组和联合体元素

题目 阅读下面的代码段,并给出程序的输出。 (1)访问数组元素。 int a[] = {61, 62, 63, 64, 65, 66}; int *p = (int *)(&a + 1); printf("%d, %d\n", *(a + 1), *(p - 1)); (2)访问联合体元素。 union {short i;char x[2]; }a;a.x[0] = 10; a.x[1] = 1; …

Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

一、前言 通过在通道画面上拾取鼠标按下的坐标&#xff0c;然后鼠标移动&#xff0c;直到松开&#xff0c;根据松开的坐标和按下的坐标&#xff0c;绘制一个矩形区域&#xff0c;作为热点或者需要电子放大的区域&#xff0c;拿到这个坐标区域&#xff0c;用途非常多&#xff0…

UE5 C++(二)— 游戏架构介绍

架构关系如下&#xff1a; 这里只简单描述下&#xff0c;具体的查看官方文档 AGameMode: AGameMode 是 AGameModeBase 的子类&#xff0c;拥有一些额外的功能支持多人游戏和旧行为。 所有新建项目默认使用 AGameModeBase。 如果需要此额外行为&#xff0c;可切换到从 AGameM…

【LangChain学习之旅】—(3) LangChain快速构建本地知识库的智能问答系统

【LangChain学习之旅】—&#xff08;3&#xff09; LangChain快速构建本地知识库的智能问答系统 项目及实现框架开发框架核心实现机制数据准备及加载加载文本文本的分割向量数据库存储文本的“嵌入”概念向量数据库概念 相关信息获取RetrievalQA生成回答并展示示例小结 Refere…

云服务器部署vue/node项目

此处以阿里云服务器为例&#xff0c;配置的是LNMP环境 vue部署云服务器&#xff1a; 以阿里云服务为例&#xff0c;端口自定义99 1、在 /usr/share/nginx/html/ 该目录下新建文件夹&#xff0c;该文件夹是部署的打好包的前端项目 例&#xff1a; 2、进入nginx目录配置相关配…

【Qt开发流程】之TCP

概述 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输协议。它是互联网协议套件中的一部分&#xff0c;用于在网络上可靠地传输数据。 TCP通过建立连接、数据传输和连接终止三个阶段来进行通信…

音频I2S

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 学习目标&#xff1a;简单了解相关概念、相关协议。 1 概述 数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信…

ELK(八)—Metricbeat部署

目录 介绍修改配置文件启动 Modulenginx开启状态查询配置Nginx module查看是否配置成功 介绍 Metricbeat 是一个轻量级的开源度量数据收集器&#xff0c;用于监控系统和服务。它由 Elastic 公司开发&#xff0c;并作为 Elastic Stack&#xff08;Elasticsearch、Logstash、Kiba…

Ubuntu18.04安装ffmpeg

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决&#xff1a;AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决&#xff1a;AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退&#xff08;不推荐&#…

【物联网】EMQX(二)——docker快速搭建EMQX 和 MQTTX客户端使用

一、前言 在上一篇文章中&#xff0c;小编向大家介绍了物联网必然会用到的消息服务器EMQ&#xff0c;相信大家也对EMQ有了一定的了解&#xff0c;那么接下来&#xff0c;小编从这篇文章正式开始展开对EMQ的学习教程&#xff0c;本章节来记录一下如何对EMQ进行安装。 二、使用…