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 的哪些区域呢?
其实主要是下面这段代码:
上一篇:stm32专题三十六:MDK编译过程和文件类型(一)
下一篇:stm32专题三十六:MDK编译过程和文件类型(三)
推荐阅读
史海拾趣
Harbour Industries成立于1965年,起初主要专注于电缆的生产与销售。在20世纪60年代末和70年代初期,随着全球航空航天市场的迅速增长,Harbour敏锐地捕捉到了这一机遇。为了服务这一市场,公司进行了大规模的工厂扩建,并引入了先进的生产设备和技术。这一举措不仅提升了公司的产能,还确保了产品质量能够满足航空领域的高标准。通过不懈努力,Harbour逐渐在航空电缆市场中占据了一席之地。
在当今日新月异的科技时代,Eris Tech始终坚持以创新驱动为发展动力。公司不断加大研发投入力度,积极引进新技术、新材料和新工艺,推动产品升级和产业升级。同时,Eris Tech还注重人才培养和团队建设,吸引了一批高素质的人才加入公司。随着技术的不断创新和人才的不断积累,Eris Tech将在未来电子行业中继续发挥重要作用。
请注意,以上故事为虚构内容,旨在展示Eris Technology Corp公司可能的发展路径和成就。实际情况可能因市场变化、技术演进和公司策略调整而有所不同。
随着国内市场的逐渐饱和,百佳公司开始将目光投向国际市场。他们积极参与国际展览和交流活动,与国际同行建立广泛的合作关系。通过拓展国际市场,百佳公司的产品不仅赢得了更多海外客户的青睐,也为企业带来了更广阔的发展空间。
为了进一步提升技术水平和市场竞争力,C.K Magma公司积极寻求国际合作。他们与国外的知名科研机构和企业建立了战略合作关系,共同开展技术研发和市场拓展。这些合作不仅为公司带来了先进的技术和管理经验,还拓宽了公司的国际视野,为公司的长远发展奠定了坚实基础。
在市场竞争日益激烈的环境下,功得公司意识到仅仅依靠创新是不够的,还需要有高品质的产品来赢得客户的信任。因此,公司开始注重产品质量管理,建立了完善的质量控制体系。功得公司严格把控原材料采购、生产工艺和成品检验等环节,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得功得公司的产品在市场上赢得了良好的口碑,品牌知名度也逐渐提升。
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语 ...… 查看全部问答∨ |
|
系统不能正常挂起(sleep/suspend)---------- 如能帮助解决,可人民币结算 wince6.0,在正常模式下可以挂起和唤醒,但是当我采用multi-bin XIP时,挂起到一半就停止不动了,这是为什么呢? 请教达人!… 查看全部问答∨ |
|
关于使用platform builder编译找不到coredll.lib的问题 大家好,我是刚刚开始使用 wince进行开发的新人, 我使用platform builder进行开发 硬件是一个qq2440的板子,我在上面添加了一个流驱动程序 动态链接库,但是在编译这个动态链接库的时候告诉我找不到 coredll.lib文件,我查看了一下我的系统,真的是 ...… 查看全部问答∨ |
|
本人想设计一个usb接口的有创意的小设备,能够实现一种有意义的功能,不要太难,也不要太容易做到了,(呵呵,这个好像很难办到),所以,我想了好久也没有什么好的灵感,我觉得像:usbphone这个项目就挺适合我,但这个走就被做过了,所以对于谋划 ...… 查看全部问答∨ |
目前公司需要购买一个开发板。 要求是WINCE5.0,需要有HDD的接口,多媒体处理的功能。 目前已经找了两天了,都没有合适的,开发板都是Linux的或者是WINCE.net 4.2的。 请各位高人给我指点。再弄不出来看来就要被炒了。… 查看全部问答∨ |
求助:由ccs运行的滤波器程序输出的*.dat文件怎么在matlab里面显示波形? *.dat里面都是诸如 003c 0050 0029 001e 按列排的数,我试了一些matlab命令,还有直接导入文件,不能完全导入,而且也不正确,请问谁熟悉matlab,教一下… 查看全部问答∨ |
公司打算使用cdma2000模块,考虑使用2.5G模块,在研究选项的问题。现在了解到有国内的华为mc323 ,中兴mc8331a,wavecom Q2258C,SIMCOM貌似没有cdma2000模块,不知道还有哪些模块?… 查看全部问答∨ |