编译过程中的链接地址对最终编译镜像文件的影响

MDK和交叉编译工具编译时都会指定程序的下载的地址(其实就是告诉程序它将在那个地址上开始执行),这有什么意义吗?

  其实这么设计有原因的,因为这里涉及到全局变量和全局函数指针的地址问题,加入当你在编译时指定编译器这段程序会在0x0c000000地址上运行,因此全局变量和全局函数指针就会从0x0c000000上开始分配地址,此时如果你把这段程序烧录到0x0c000000地址上运行,变量的访问和指令存取不会有人任何问题,但是如果你将程序下载到0x00000000上运行时,在程序会在访问全局变量时,实际上这个变量地址分配的地址是0x00000001但是,因为你编译是连接地址不是0x00000000所以程序会到0x0c000001去读取这个变量,此时就会读到一个错误的值。对于函数指针也是相同的道理,但此时指令就跑飞了。

ARM处理器上的用处(相对跳转和绝对跳转)

绝对跳转:就是执行了这一条指令之后就会跳转到绝对跳转的指令中的地址去执行。
相对跳转:从当前地址偏移一定的偏移地址去执行一个程序。
将被编译到0xC0000000地址的代码放到0x00000000地址开始执行,如果它们只使用顺序执行或者相对跳转执行方式就可以正常运行(未使用全局变量和全局函数指针),但如果使用了绝对寻址,那么程序就跑飞了。
我们参照下面这段伪代码来说明这个情况。

指令编号
指令功能
指令1 :顺序执行
指令2 :顺序执行
指令3 :相对跳转到指令5
指令4 :顺序执行
指令5 :顺序执行
指令6 :绝对跳转到指令8
指令7 :顺序执行
指令8 :顺序执行

在编译、链接的时候,这段程序被告知放在0xC0000000地址空间,编译后烧录到0x00000000结果在存储设备中的存放结果为(每条指令以4字节计算):

指令地址        指令编号    指令功能            下条指令地址0x00000000     指令1:    顺序执行            当前地址+4
0x00000004     指令2:    顺序执行            当前地址+4
0x00000008     指令3:    相对跳转到指令5      当前地址+8
0x0000000C     指令4:    顺序执行            当前地址+4
0x00000010     指令5:    顺序执行            当前地址+4
0x00000014     指令6:    绝对跳转到指令8      0xC000001C
0x00000018     指令7:    顺序执行            当前地址+4
0x0000001C     指令8:    顺序执行            当前地址+4      

程序从0x00000000开始运行直到第五条指令都是不会出错的,但是当执行完指令6后程序就会跑飞了,因为指令6是一条绝对跳转的指令但0xC000001C空间没有代码,这样程序就跑飞了。但当这段程序被放在0xC0000000起始空间时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,在指令6执行时执行绝对寻址的方法从0xC0000014正确跳转到指令8所在的0xC000001C位置,这段代码运行正常。(参考博客:http://blog.sina.com.cn/s/blog_908da74601011bg6.html)

如图:

MDK编译后的STM32工程 map文件简单分析

只看map文件中有用的部分:

Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量

Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952

Code, RO-data,RW-data ............flash
RW-data, ZIdata...................RAM (内存)

 

存储Size:

RO size: Code + RO_data

RW size: RW_data + ZI_data

ROM (minimum)size = Code + RO_data + RW_data (即烧/下载程序到FLASH/ROM时,所占用的最小空间)

Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

RAM size: RW Data + ZI Data (即程序运行的时,RAM使用的空间)

一个ARM程序包含3部分:RO段,RW段和ZI段
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的零初始化的变量
由以上3点说明可以理解为:
RO就是readonly,
RW就是read/write,
ZI就是zero

完事,今天好冷哎!

转载于:https://www.cnblogs.com/w-smile/p/10073790.html

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

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

相关文章

三维空间中曲线绕任意轴旋转所得的旋转曲面求法

三维空间中曲线绕任意轴旋转所得的旋转曲面求法 对2023汤家凤考研高等数学讲义225页2.三维空间直线旋转曲面的解释和推广 ©️ sylvanding

彩图完美解释:麦克斯韦方程组

来源:微波射频网麦克斯韦方程组麦克斯韦方程组(英语:Maxwells equations)是英国物理学家麦克斯韦在19世纪建立的描述电磁场的基本方程组。它含有四个方程,不仅分别描述了电场和磁场的行为,描述了它们之间的…

基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道

作者:尹航 在前文基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道中,我们介绍了使用服务网格 ASM 的严格模式流量泳道进行全链路灰度管理的使用场景。该模式对于应用程序无任何要求,只需…

中国世界工厂地位为什么不会动摇

来源:工信头条文:赵一之在贸易保护主义和疫情的双重影响下,中国作为世界工厂是否会面临大规模制造业外迁,是时常引起关注的问题。复杂产品的供应链彼此环环相扣,缺失任何一环,都会影响到整个行业。疫情指出…

一文彻底解决YOLOv5训练找不到标签问题

YOLOv5 训练找不到标签, No labels found in /path/train.cache 问题的解决方法(亲测可用) ❤️ 网上绝大部分教程所述解决方法都不靠谱,也没有分析问题发生的原因,本文彻底解决了YOLOv5训练时找不到标签,出现 No labels found in /path/trai…

yolov5踩坑记录:标签错位(PIL读取图片方向异常)

PIL踩坑记录:读取图片方向异常(yolov5标签错位) 奇怪的现象 今天用 YOLOv5 做项目时,对数据集的标记出现了奇怪的现象,在下述测试用例中可明显看到,标记框偏离了物体,故发文阐述原因和解决方法…

理解与理论:人工智能基础问题的悲观与乐观

来源:筑土为坛梅剑华,男,1980年生,湖北秭归人,山西大学哲学社会学院教授,博士生导师,先后赴美国罗格斯大学、匹兹堡大学、奥地利萨尔茨堡大学等访学,研究方向是语言哲学与心灵哲学、…

设计模式系列 - 原型模式

所谓原型模式是指为创建重复对象提供一种新的可能。 介绍 当面对系统资源紧缺的情况下,如果我们在重新创建一个新的完全一样的对象从某种意义上来讲是资源的浪费,因为在新对象的创建过程中,是会有系统资源的消耗,而为了尽可能的节…

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU) 编程实现图像的二值化,分析不同的阈值对二值化图像的影响。 问题描述 传统的机器视觉通常包括两个步骤:预处理和物体检测…

全球最快AI超级计算机开动,每秒4百亿亿浮点运算!正拼接最大宇宙3D地图

来源:venturebeat宇宙是在不断膨胀的吗?是的!而令宇宙不断膨胀的「罪魁祸首」就是暗能量。作为是宇宙中最神秘的物质,它看不见摸不着,为了捕捉它,人类在地球上建立了许多相关实验,但都成效甚微。…

基于YOLOv5的中式快餐店菜品识别系统

基于YOLOv5的中式快餐店菜品识别系统[金鹰物联智慧食堂项目] 摘要 本文基于YOLOv5v6.1提出了一套适用于中式快餐店的菜品识别自助支付系统,综述了食品识别领域的发展现状,简要介绍了YOLOv5模型的历史背景、发展优势和网络结构。在数据集预处理过程中&am…

谋局科技创新:两院院士大会释放重要信号

来源:经济参考报作者:班娟娟、钟源从坚持把科技自立自强作为国家发展的战略支撑,到加快建设科技强国,实现高水平科技自立自强;从加强原创性、引领性科技攻关,坚决打赢关键核心技术攻坚战,到强化…

图像加减运算

图像的加减运算 原创文章:转载请注明出处 ©️ Sylvan Ding 图像相加 图像相加常常被用来进行图片降噪处理。令 g(x,y)g(x,y)g(x,y) 是无噪声理想图像 f(x,y)f(x,y)f(x,y) 被高斯加性噪声 η(x,y)\eta (x,y)η(x,y) 污染后的图像,即 g(x,y)f(x,y)η…

随机森林是我最喜欢的模型

来源:机器之心TensorFlow 决策森林 (TF-DF) 现已开源,该库集成了众多 SOTA 算法,不需要输入特征,可以处理数值和分类特征,为开发者节省了大量时间。在人工智能发展史上,各类算法可谓层出不穷。近十几年来&a…

拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

拉普拉斯锐化 [原理及Python实现](含拉氏标定、拉普拉斯标定) 原创文章;转载请注明出处:©️ Sylvan Ding 锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样,应用范围从电子印刷和医学成像到工业…

以太坊 方法签名

最近在工作中使用web3j调用合约,发现一个比较头疼的问题?复杂一点的合约参数多了,函数的方法签名老是出错。在这之前调用合约方法一直都是拼接合约的函数签名以及参数。为了能快速的获取每个合约的函数签名,我在思考是否便捷可行解…

训练 GPT-3,为什么原有的深度学习框架吃不消?

来源:AI前线作者:一流科技 CEO 袁进辉近年来,深度学习被广泛应用到各个领域,包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中,一个共同的特点就是模型规模越来越大,比如 GPT-3 模型的参…

Canny边缘检测原理及其python实现

Canny边缘检测原理及其python实现 转载请注明出处:©️ Sylvan Ding Canny边缘检测算法 多数分割算法均基于灰度值的两个基本性质之一:不连续性和相似性。图像的边缘检测就是基于灰度的不连续性(灰度突变)来实现图像分割的。…

离奇的梦境,能够防范大脑过拟合

来源:混沌巡洋舰 1 )梦让我们对世界的理解不再那么简单化关于为什么大脑进化出夜间做梦?神经科学界提出了各种假说,诸如通过梦来调节情绪,巩固记忆,或梦可以帮助我们选择性的遗忘,对我们应对现实世界的问题…

RGB空间中的彩色图像分割原理及其python实现

RGB空间中的彩色图像分割 ⭐️ 为尊重原创性!转载请注明出处:©️ Sylvan Ding’s Blog 概述 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法,并用python实现了各个算法。之后将二者的优势结合,提出了改进后的曼哈顿…