#stm32整理(二)关于MDK的编译过程及文件类型全解

参考野火开发指南如有侵权即刻删除,只是为了学习交流使用

1、编译

1、编译过程简介

在这里插入图片描述

(1)编译,MDK 软件使用的编译器是 armcc 和 armasm,它们根据每个 c/c++ 和汇编源文件编译
成对应的以“.o”为后缀名的对象文件 (Object Code,也称目标文件),其内容主要是从源文
件编译得到的机器码,包含了代码、数据以及调试使用的信息;

将C/C++和汇编等文件编译成为,o文件 ,o文件是对象文件(目标文件)
(2)链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”;

(3) 格式转换,一般来说 Windows 或 Linux 系统使用链接器直接生成可执行映像文件 elf 后,内
核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内
容加载到芯片上,所以还需要对链接器生成的 elf 映像文件利用格式转换器 fromelf 转换成
“.bin”或“.hex”文件,交给下载器下载到芯片的 FLASH 或 ROM 中。

编译c到o 链接o生成.axf .elf文件 通过转换器转换成.bin文件或.hex文件。

2、编译具体过程分析

在这里插入图片描述
(1) 提示信息的第一部分说明构建过程调用的编译器。图中的编译器名字是“V5.06(build 20)”,
后面附带了该编译器所在的文件夹。在电脑上打开该路径,可看到该编译器包含图 40_3 中
的各个编译工具,如 armar、armasm、armcc、armlink 及 fromelf,后面四个工具已在图 40_1
中已讲解,而 armar 是用于把.o 文件打包成 lib 文件的。

在这里插入图片描述
(2) 使用 armasm 编译汇编文件。图中列出了编译 startup 启动文件时的提示,编译后每个汇编
源文件都对应有一个独立的.o 文件。

(3) 使用 armcc 编译 c/c++ 文件。图中列出了工程中所有的 c/c++ 文件的提示,同样地,编译后
每个 c/c++ 源文件都对应有一个独立的.o 文件。

(4) 使用 armlink 链接对象文件,根据程序的调用把各个.o 文件的内容链接起来,最后生成程序
的 axf 映像文件,并附带程序各个域大小的说明,包括 Code、RO-data、RW-data 及 ZI-data
的大小。

(5) 使用 fromelf 生成下载格式文件,它根据 axf 映像文件转化成 hex 文件,并列出编译过程出
现的错误 (Error) 和警告 (Warning) 数量。
(6) 最后一段提示给出了整个构建过程消耗的时间。
构建完成后,可在工程的“Output”及“Listing”目录下找到由以上过程生成的各种文件,见图
40_4。

3、程序的组成、存储与运行

3、1CODE、RO、RW、ZI Data 域及堆栈空间

Code:即代码域,它指的是编译器生成的机器指令,这些内容被存储到 ROM 区。

RO-data:Read Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM 区,因而程序不能修改其内容。例如 C 语言中 const 关键字定义的变量就是典型的RO-data。

RW-data:Read Write data,即可读写数据域,它指初始化为“非 0 值”的可读写数据,程序
刚运行时,这些数据具有非 0 的初始值,且运行的时候它们会常驻在 RAM 区,因而应用
程序可以修改其内容。例如 C 语言中使用定义的全局变量,且定义时赋予“非 0 值”给该
变量进行初始化 全局非零变量

ZI-data:Zero Initialie data,即 0 初始化数据,它指初始化为“0 值”的可读写数据域,它与
RW-data 的区别是程序刚运行时这些数据初始值全都为 0,而后续运行过程与 RW-data 的
性质一样,它们也常驻在 RAM 区,因而应用程序可以更改其内容。例如 C 语言中使用定
义的全局变量,且定义时赋予“0 值”给该变量进行初始化 (若定义该变量时没有赋予初始
值,编译器会把它当 ZI-data 来对待,初始化为 0);未初始化的全局变量,初始化为0的全局变量

ZI-data 的栈空间 (Stack) 及堆空间 (Heap):在 C 语言中,函数内部定义的局部变量属于栈
空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存
空间。而使用 malloc 动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于
ZI-data 区域的,这些空间都会被初始值化为 0 值。编译器给出的 ZI-data 占用的空间值中包
含了堆栈的大小 (经实际测试,若程序中完全没有使用 malloc 动态申请堆空间,编译器会
优化,不把堆空间计算在内)。临时变量(局部变量) malloc分布区

在这里插入图片描述

3、2程序的存储与运行

静止态的程序被存储在非易失存储器中,如 STM32 的内部 FLASH,因而系统掉电后也能正常保存。但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中 (RAM),掉
电后这些数据会丢失。静止状态程序存在ROM中比如fllash 运行状态这些数据被放在RAM中

在这里插入图片描述
图中的左侧是应用程序的存储状态,右侧是运行状态,而上方是 RAM 存储器区域,下方是 ROM
存储器区域。

程序在存储状态时,RO 节 (RO section) 及 RW 节都被保存在 ROM 区。当程序开始运行时,内核直接从 ROM 中读取代码,并且在执行主体代码前,会先执行一段加载代码,它把 RW 节数据从ROM 复制到 RAM,并且在 RAM 加入 ZI 节,ZI 节的数据都被初始化为 0。加载完后 RAM 区准备完毕,正式开始执行主体程序。**程序开始运行前执行加载代码将RW中的值复制到RAM中,并在RAM中加入zi节且其中初始化数据为0 **

STM32 的 RO 区域不需要加载到 SRAM,内核直接从 FLASH 读取指令运行。计算机系统的应用
程序运行过程很类似,不过计算机系统的程序在存储状态时位于硬盘,执行的时候甚至会把上
述的 RO 区域 (代码、只读数据) 加载到内存,加快运行速度,还有虚拟内存管理单元 (MMU) 辅
助加载数据,使得可以运行比物理内存还大的应用程序。而 STM32 没有 MMU,所以无法支持
Linux 和 Windows 系统

当程序存储到 STM32 芯片的内部 FLASH 时 (即 ROM 区),它占用的空间是 Code、RO-data 及
RW-data 的总和,所以如果这些内容比 STM32 芯片的 FLASH 空间大,程序就无法被正常保存
了。当程序在执行的时候,需要占用内部 SRAM 空间 (即 RAM 区),占用的空间包括 RW-data 和
ZI-data。应用程序在各个状态时各区域的组成见表 40‑2。。

在这里插入图片描述
静态code+ROdata+RWdata=flash占用控价大小
动态RWdata+ZIdata=SRAM(RAM)占用大小

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

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

相关文章

修改el-date-picker宽度

<div style"width: 100%"><el-date-pickerstyle"width:100%"v-model"value"type"datetimerange"start-placeholder"开始日期"end-placeholder"结束日期":default-time"[12:00:00]"value-forma…

Redis队列Stream

1 缘起 项目中处理文件的场景&#xff1a; 将文件处理请求放入队列&#xff0c; 一方面&#xff0c;缓解服务器文件处理压力&#xff1b; 另一方面&#xff0c;可以根据文件大小拆分到不同的队列&#xff0c;提高文件处理效率。 这是Java开发组Leader佳汇提出的文件处理方案&a…

hdlbits系列verilog解答(8位宽移位寄存器)-24

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 这项练习是module_shift移位寄存器的延伸。模块端口不是只有单个引脚,我们现在有以向量作为端口的模块,您将在其上附加线向量而不是普通线网数据。与 Verilog 中的其他位置一样,端口的向量长度不必与连接到它…

Go语言用Resty库编写的音频爬虫代码

目录 一、Go语言与Resty库简介 二、音频爬虫的实现 1、确定抓取目标 2、使用Resty发送HTTP请求 3、解析响应数据 4、下载音频文件 5、并发下载音频文件 三、注意事项 总结 随着互联网的飞速发展&#xff0c;网络爬虫逐渐成为数据获取和分析的重要工具。在音频领域&…

[NSSCTF 2nd] web刷题记录

文章目录 php签到MyBox非预期解预期解 php签到 源代码 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, …

【计算机网络】什么是HTTPS?HTTPS为什么是安全的?

【面试经典题】 前言&#xff1a; HTTP最初的设计就是用于数据的共享和传输&#xff0c;并没有考虑到数据的安全性&#xff0c;如窃听风险&#xff0c;篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密&#xff0c;数据完整性检验和身份认证…

BUUCTF_练[CISCN2019 华北赛区 Day1 Web5]CyberPunk

[CISCN2019 华北赛区 Day1 Web5]CyberPunk 文章目录 [CISCN2019 华北赛区 Day1 Web5]CyberPunk掌握知识解题思路代码分析paylaod的构建正式解题 关键paylaod 掌握知识 ​ php伪协议读取文件&#xff1b;源码泄露hint &#xff1b;代码审计 发现二次注入点&#xff1b;SQL语句的…

【Unity小技巧】可靠的相机抖动及如何同时处理多个震动(附项目源码)

文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句 围在城里的人想逃出来&#xff0c;站在城外的人想冲进去&#xff0c;婚姻也罢&#xff0c;事业也罢&#xff0c;人生的欲望大都如此…

从 malloc 分配大块内存失败 来简看 linux 内存管理

文章目录 背景Glibc MallocMalloc 分配大块内存失败原因Overcommit_memory 实现OOM (Out Of Memory) 的实现 背景 应用进程 malloc 返回了null&#xff0c;但是观察到的os 的free内存还有较大的余量 &#xff0c;很奇怪为什么会这样&#xff1f; 不可能是oom导致的&#xff0…

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析 1 题目 2023 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道B&#xff1a;电商零售商家需求预测及库存优化问题电商平台存在着上千个商家&#xff0c;他们会将商品货物放在电商配套的仓库…

企业金蝶KIS软件服务器中了locked勒索病毒怎么办,勒索病毒解密

最近一段时间&#xff0c;网络上的locked勒索病毒又开始了新一波的攻击&#xff0c;给企业的正常生产生活带来了严重影响。经过最近一段时间云天数据恢复中心对locked勒索病毒的解密&#xff0c;为大家整理了以下有关locked勒索病毒的相关信息。近期locked勒索病毒主要攻击金蝶…

小白如何在一个月写一篇论文(中文核心,SCI)

小白如何半年发3篇sci的我教你如何快速“水”一篇sci论文_哔哩哔哩_bilibili 计算机视觉&#xff0c;cv领域 半年发3篇sci的我教你如何快速“水”一篇sci论文 计算机视觉(辅导 SCI EI 核心) 微信&#xff1a;whbwqq123或主页加up 小白如何快速写出一篇论文并成功发表&…

83.每日一练:搜索插入位置(力扣第35题)

问题描述 代码解决以及思想 class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0; // 定义左边界int right nums.size() - 1; // 定义右边界while (left < right) { // 当左边界小于…

什么是鉴权?一篇文章带你了解postman的多种方式

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通…

用友 GRP-U8 存在sql注入漏洞复现

0x01 漏洞介绍 用友 GRP-U8 license_check.jsp 存在sql注入&#xff0c;攻击者可利用该漏洞执行任意SQL语句&#xff0c;如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。 fofa&#xff1a;app”用友-GRP-U8” 0x02 POC: /u8qx/license_check.jsp?kj…

基于【逻辑回归】的评分卡模型金融借贷风控项目实战

背景知识&#xff1a; 在银行借贷过程中&#xff0c;评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段。今天我们来复现一个评分A卡的模型。完整的模型开发所需流程包括&#xff1a;获取数据&#xff0c;数据清洗和特征工程&#xff0c;模型开发&#xff0c…

【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】

本篇用到的资料&#xff1a;https://gitee.com/Allengan/cloud-demo.githttps://gitee.com/Allengan/cloud-demo.git 目录 1.认识微服务 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 …

Composition API的引入

目录 全局API的移除和替代 插件的改进 TypeScript支持的增强 优势 劣势 总结 Vue.js 3.x版本引入了Composition API&#xff0c;这是一个全新的API风格&#xff0c;旨在提高代码的可读性和重用性。Composition API使我们可以根据逻辑相关性组织代码&#xff0c;而不是按照…

Typora(morkdown编辑器)的安装包和安装教程

Typora&#xff08;morkdown编辑器&#xff09;的安装包和安装教程 下载安装1、覆盖文件2、输入序列号①打开 typora &#xff0c;点击“输入序列号”&#xff1a;②邮箱一栏中任意填写&#xff08;但须保证邮箱地址格式正确&#xff09;&#xff0c;输入序列号&#xff0c;点击…

从0到1之微信小程序快速入门(03)

目录 什么是生命周期函数 WXS脚本 ​编辑 与 JavaScript 不同 纯数据字段 组件生命周期 定义生命周期方法 代码示例 组件所在页面的生命周期 代码示例 插槽 什么是插槽 启用多插槽 ​编辑 定义多插槽 组件通信 组件间通信 监听事件 触发事件 获取组件实例 自…