历史上的今天
返回首页

历史上的今天

今天是:2024年11月01日(星期五)

正在发生

2021年11月01日 | stm32专题三十六:MDK编译过程和文件类型(二)

2021-11-01 来源:eefocus

MDK工程的文件类型:


1 下图为 Project 目录下的工程文件


实际上,只需要有 unprojx 文件,就可以恢复整个工程。

具体描述:

2 源文件

3 output 和 list 文件

详细分析:


1 uvprojx 文件


uvprojx 文件就是我们平时双击打开的工程文件,它记录了整个工程的结构,如芯片类型、工程包含了哪些源文件等内容。

可以使用vscode直接打开 uvprojx ,来看一下里面的具体内容:

2 uvoptx 文件


uvoptx 文件记录了工程的配置选项,如下载器的类型、变量跟踪配置、断点位置以及当前已打开的文件等。


我们在程序 main.c 的第81行设置断点,观察uvoptx的输出情况:

结果如下:

包括下载器类型等配置:

3 uvguix 文件


uvguix 文件记录了 MDK 软件的 GUI 布局,如代码编辑区窗口的大小、编译输出提示窗口的位置等。


uvprojx、 uvoptx 及 uvguix 都是使用 XML 格式记录的文件,若使用记事本打开可以看到 XML 代码。而当使用 MDK 软件打开时,它根据这些文件的 XML 记录加载工程的各种参数,使得我们每次重新打开工程时,都能恢复上一次的工作环境。这些工程参数都是当 MDK 正常退出时才会被写入保存,所以若 MDK 错误退出时(如使用 Windows 的任务管理器强制关闭),工程配置参数的最新更改是不会被记录的,重新打开工程时要再次配置。根据这几个文件的记录类型,可以知道 uvprojx 文件是最重要的,

删掉它我们就无法再正常打开工程了,而 uvoptx 及 uvguix 文件并不是必须的,可以删除,重新使用 MDK 打开 uvprojx 工程文件后,会以默认参数重新创建 uvoptx 及 uvguix 文件。(所以当使用 Git/SVN 等代码管理的时候,往往只保留 uvprojx 文件)。


4 源文件

5 output 目录下生成的文件


在mdk中,可以指定output文件的输出路径:

output生成的文件如下所示:

Ⅰ 静态链接库 .lib文件


得到生成的*.lib 文件后,可把它像 C 文件一样添加到其它工程中,并在该工程调用 lib提供的函数接口,除了不能看到*.lib 文件的源码,在应用方面它跟 C 源文件没有区别。



Ⅱ .dep   .d依赖文件


*.dep 和*.d 文件(Dependency file)记录的是工程或其它文件的依赖, 主要记录了引用的头文件路径, 其中*.dep 是整个工程的依赖, 它以工程名命名, 而*.d 是单个源文件的依赖,它们以对应的源文件名命名。

先看一下.d文件,我们在整个文件夹中选一个.d文件:

直接vscode打开来看一下内容,可以看到,bsp_led.d文件,其实就是记录了bsp_led这个源文件包含的头文件路径。


知道单个文件的依赖以后,那么我们再看下 .dep 文件,记录了整个工程的依赖(记录了所有源文件所包含的头文件路径):

Ⅲ .crf 交叉引用文件

打开 .crf 乱码如下:


6 .o .axf .elf文件

ELF 是 Executable and Linking Format 的缩写,译为可执行链接格式,该格式用于记录目标文件的内容。在 Linux 及 Windows 系统下都有使用该格式的文件用于记录应用程序的内容,告诉操作系统如何链接、加载及执行该应用程序。


目标文件主要有 3 种类型:

6 o 文件与 axf 文件的关系


根据上面的分类,我们了解到, *.axf 文件是由多个*.o 文件链接而成的,而*.o 文件由相应的源文件编译而成,一个源文件对应一个*.o 文件。

例如:当我们在main.c中进行修改,如下所示,再点击编译时,由于没有改动其他的源文件,实际上只重新编译了main.c,而原来就生成的其他 .o 文件不需要再参与编译,链接器把新的 .o文件和之前其他 .o文件重新连接成 .elf文件。

然后再进行编译,结果如下:

链接器的作用:

代码如下:

图解过程如下:

7 ELF文件头


接下来我们看看具体文件的内容,使用 fromelf 文件可以查看*.o、 *.axf 及*.lib 文件的ELF 信息。


首先使用windows powershell,查看 fromelf 工具的帮助信息:

根据命令提示,接下来我们使用命令语句来查看bsp_led.o文件的基本信息:


fromelf --text -v .bsp_led.o   


打印信息如下,可以看到,一下子打印出来了很多信息。

为了方便查看,我们可以使用windows 重定向符号 > 将命令行中输出的内容存储到文件中,具体用法如下:

我们使用如下的命令语句,输出详细信息到txt:


 fromelf --text -v .bsp_led.o > bsp_led_info.txt

可以看到,在当前目录下新生成了 bsp_led_info.txt 的文件:

同样的,我们也可以生成整个 .axf 文件的详细信息:


 fromelf --text -v .流水灯.axf > flow_light_info.txt

结果如下:

在之前有分析过 .o 文件的结构如下,包括文件头、程序头(可选)、节区、节区头部表。

现在来看一下 bsp_led.o的文件内容:

接下来是节区信息:

关于节区信息的描述:

接下来看一下 .o文件 和 .elf 文件的对比:

再进行一下对比,可以看到,在节区前,elf文件确实存在程序头:

看一下程序头的具体内容:

下面是 MDK 的编译信息:

对照着 MDK 的编译信息,我们来分析一下这个文件:


1 首先是地址,程序头的物理地址和虚拟地址均为0X0800 0000,这是stm32内部flash的起始地址。而由于stm32不带有MMU内存管理单元,因此物理地址就等于虚拟地址;


2 Size in file:1440字节,表示程序在文件中占据的大小。对比上图,我们发现:


Size in file = Code + RO-data + RW-data = 1096 + 336 + 8 = 1440;


3 Size in memory:3976 字节,表示若程序加载到内存,占据的内存空间。 


Size in memory = Code + RO-data + RW-data + ZI-data = 1440 + 2536 = 3976;


4 8字节对齐,这个在freertos中非常常用。


接下来看一下节区信息:

反汇编代码


使用以下语句生成反汇编代码:


fromelf --text -c .bsp_led.o > bsp_led_o_info.txt   

生成的反汇编代码如下:

经过链接器生成的elf文件,来和.o文件对比看一下:

现在我们可以从汇编代码中清晰的看到,链接后的elf文件,为每个函数都分配了地址,可以调用正确的指令来执行。


分散加载代码


学习至此,还有一个疑问,前面提到程序有存储态及运行态,它们之间应有一个转化过程,把存储在 FLASH 中的 RW-data 数据拷贝至 SRAM。然而我们的工程中并没有编写这样的代码,在汇编文件中也查不到该过程,芯片是如何知道 FLASH 的哪些数据应拷贝到 SRAM 的哪些区域呢?


其实主要是下面这段代码:


推荐阅读

史海拾趣

启攀微电子(Chiphomer)公司的发展小趣事

2009年,全球经济遭受金融海啸的冲击,启攀微电子也面临着巨大的市场压力。然而,公司并没有选择退缩,而是选择了坚守与创新。在经济危机的背景下,公司加强了产品推广和客户支持,同时加快了新品开发的步伐。经过几年的打拼,启攀微电子的消费类电子产品在手机领域取得了一定的市场认可,出货量大幅提升,市场份额稳步上升。

G-Two Inc公司的发展小趣事

背景:2003年,福斯特的创始人林建华,一位在纺织业和化工领域有着丰富经验的工程师,决定跨界进入光伏材料行业。当时,国内光伏组件封装所需的光伏胶膜几乎全部依赖进口,被国外几家大公司垄断。

发展:林建华凭借在热熔网膜领域的技术积累,带领团队成功研发出EVA胶膜,打破了国外技术垄断。这一技术突破不仅降低了国内光伏组件的生产成本,也为福斯特在光伏材料领域的崛起奠定了坚实基础。

成果:2008年,福斯特的EVA胶膜产品凭借优异的性能和价格优势,成功打入国内光伏组件企业的供应名录,并跻身全球EVA胶膜供应商前三强。

Eurotech公司的发展小趣事

Eurofarad公司自创立之初,就专注于电容器技术的研发。在当时,电容器市场已经相当成熟,但Eurofarad公司凭借对材料科学的深入研究,成功开发出一种新型的高性能电容器。这种电容器不仅具有更高的能量密度,而且寿命更长,稳定性更好。这一技术突破为Eurofarad公司赢得了市场的初步认可,也为公司后续的发展奠定了坚实的基础。

E-San Electronic Co Ltd公司的发展小趣事

随着市场的不断变化和消费者需求的升级,E-San Electronic Co Ltd意识到技术创新是企业持续发展的关键。公司投入大量资金和资源,建立了自己的研发团队,并与多所高校和研究机构建立了合作关系。经过数年的努力,公司成功研发出了一系列具有自主知识产权的核心技术,这些技术不仅提升了产品的性能和质量,也为企业赢得了更多的市场份额。

Advanced Power Solutions公司的发展小趣事

Advanced Power Solutions公司非常重视人才培养和企业文化建设。公司注重员工的职业发展和培训,为员工提供了广阔的职业发展空间和学习机会。同时,公司还倡导开放、创新的企业文化,鼓励员工提出新的想法和建议。这种积极向上的企业文化吸引了大量优秀人才的加入,也为公司的持续发展提供了强大的动力。

以上五个故事框架仅用于说明Advanced Power Solutions公司可能的发展路径和成就,并不代表公司的实际历史。在实际撰写时,需要根据公司的具体情况进行调整和补充。

百佳(BAIJIA)公司的发展小趣事

随着国内市场的逐渐饱和,百佳公司开始将目光投向国际市场。他们积极参与国际展览和交流活动,与国际同行建立广泛的合作关系。通过拓展国际市场,百佳公司的产品不仅赢得了更多海外客户的青睐,也为企业带来了更广阔的发展空间。

问答坊 | AI 解惑

nRF24L01外围电路问题

ant1和ant2为什么要这样接啊,ant1外围电路阻抗等于多少?如何计算啊?C6起什么作用,大小如何决定呢。 那位大哥帮忙下…

查看全部问答>

電子電路設計需要哪些基礎知識

電子線路設計需要哪些基礎知識 如電源部份掌握的知識 邏輯部份如CPU工作的系統條件與外圍器件如何溝通的 數電 模電 PCB 設計 輔助軟件應用等…

查看全部问答>

关于NAND flash 驱动,Driver高手请进...

小弟对NAND flash的single-die有些了解,但对multi-die的不太了解,也没用过,请问大虾们: 1. multi-die和single-die的具体区别是什么,写driver时需要注意什么?(datasheet上咋没说明,555.。。。) 2. 在调timing时,应该调到什么样的程度才 ...…

查看全部问答>

奇怪,我的VS2005找得到WINCE5模拟器,却启动不成功。WINCE5模拟器是完全安装VS2005是装上去的。

奇怪,我的VS2005在模拟器管理里找得到WINCE5模拟器,却启动不成功。WINCE5模拟器是完全安装VS2005是装上去的。…

查看全部问答>

Wince 模拟u盘问题。

现在想把wince5 模拟成U盘,用了wince5的源码usbfn,storage目录中。 注册表也做了相应的改动,现在pc机已经能够识别出Upan。 可是在通信过程中,PC机老是会发 0x23指令,而次指令并不支持。导致reset。 在网上查到: 一个U盘插上,Windows要连 ...…

查看全部问答>

两个线程之间的切换所需要的时间

请教大家一个线程的切换问题:请高手们指点指点    在我的程序中用到好几个线程,而且在线程中频繁用到SLEEP()延时函数, 这样可能会造成线程间的频繁切换,可能会使软件的运行效率降低, 我想知道两个线程之间的切换需要多少时间 ...…

查看全部问答>

缺氧报警器

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 …

查看全部问答>

SOIC窄体16PIN1.27mm脚距,这种封装在元件库里焊盘一般宽和长是多少?

SOIC窄体16PIN1.27mm脚距,这种封装在元件库里焊盘一般宽和长是多少? 在orcad中发现宽有0.6mm,长竟然有2.5mm。 焊盘的画法是否有相应的标准来参照啊…

查看全部问答>

stm32的tim输出比较模式区别

timing  toggle  active inactive四种模式有什么区别 比较匹配时,输出管脚可以保持它的电平(OCxM=000)、 被设置成有效电平(OCxM=001)、   ?? 被设置成无有效电平(OCxM=010)   ? ? 或进行翻转 ...…

查看全部问答>

滤波电路和放电路对片式钽电容器参数性能的不同选择

转载的:(http://blog.163.com/qhrong718@126/blog/static/882427522011024567513/?fromdm&isFromSearchEngine=yes) 一,滤波电路中使用的片式钽电容器的性能选择     滤波电路是片式钽和氧化铌电容器最常用电路, 电容 ...…

查看全部问答>