浅谈Keil-MDK创建项目编译过程---Code-data,RO-data,RW-data,ZI-data

2023-11-11 12:50

本文主要是介绍浅谈Keil-MDK创建项目编译过程---Code-data,RO-data,RW-data,ZI-data,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浅谈Keil-MDK创建项目&编译过程---Code-data,RO-data,RW-data,ZI-data

    • 一、编译过程
    • 二、MDK 编译工具
      • (1)创建一个新的工程
      • (2)添加 startup(启动文件,由汇编编写)
      • (3) 初识工程常见一串错误分析
      • (4) 看看编译过程输出显示的信息
    • 三、Code-data,RO-data,RW-data,ZI-data 介绍
    • 四、最后附带一张图,了解哈工程文件的简单含义

谈谈Keil-MDK编译输出的:Code-data,RO-data,RW-data,ZI-data
Code-data,RO-data,RW-data,ZI-data 程序运行时加载过程

一、编译过程

在这里插入图片描述

  (1) 编译,MDK 软件使用的编译器是 armcc 和 armasm,它们根据每个 c/c++和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息
  (2) 链接,链接器 armlink 把各个.o 文件及库文件链接成一个映像文件“.axf”或“.elf”
  (3) 格式转换,一般来说 Windows 或 Linux 系统使用链接器直接生成可执行映像文件 elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的 elf 映像文件利用格式转换器fromelf 转换成“.bin”或“.hex”文件,交给下载器下载到芯片的 FLASH 或 ROM 中

二、MDK 编译工具

(1)创建一个新的工程

(2)添加 startup(启动文件,由汇编编写)

 启动文件顾名知义,也就是当STM32上电启动后第一个执行的汇编程序
  启动文件主要功能:
    · 初始化堆栈指针 SP =_initial_sp
    · 初始化程序计数器指正 PC = Reset_Handler
    · 设置堆、栈的大小
    · 初始化中断向量表
    · 配置外部 SRAM 作为数据存储器(此项有用户根据自己用的开发板的实际情况做配置)
    · 调用 SystemIni() 函数配置 STM32 的系统时钟
    · 调用 C 库函数_main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界
   启动文件的具体代码不作详细分析感兴趣可以去查阅相关的资料,还是比较全的

 由于官方提供的启动文件分了不同 型号,如果你不知道你用的芯片改选择哪一种型号的启动文件,不要慌张,Keil-MDK IDE 提供有这个功能,在你选择完STM32 型号后(当然在这之前你的导入芯片的 package, 比如你可以这样操作:点击去这里瞧瞧),点击OK,会弹出一个框按下图操作即可,得到启动文件

工程建好后为了让工程看起来比较美观,你还可以做如下操作:

  当然就是 keil 5 的操作,如果是 keil 4, 他会弹出来一个 copy 选项,问你是否 copy 启动文件到工程,你选择了,他就会自动给你 copy 进来并创建相应的目录
  
  另外你也可以自己通官方提供的启动文件,自己 copy 到工程目录下然后导入到工程,这得需要你自己来确定用什么类型的启动文件(就不用MDK 来帮你确定使用什么型号的启动文件了), 那么选型见下表

到这儿工程搭建好,现在就差 C 的世界了


  · 完成 C 世界的创建

一个简单的工程创建就到此完成了

(3) 初识工程常见一串错误分析

既然前面工程已经搭建完美,首先我们来编译一下

  哈,出现了一个 1 Error(s), 1 Warning(s)一个错误一个警告,不慌,我们看看它是什么
  
  Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o)
  
  这句话说得是 startup_stm32f10x_md.c文件中出现了未定义符号 SystemInit, 我们去看看

  这里IMPORT SystemInit表示SystemInit来时外部文件(IMPORT:表示该标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似)
  
  前面说过 启动文件需要调用 SystemInit 来设置系统时钟,故这里的 SystemInit 函数需要在外部实现,这里不做具体的配置(具体如何配置可以查阅STM32的用户手册进行相应的配置),为了让编译器不报错可以加如下代码:

Error 处理完毕,现在分析 Warning
  
  warning: #1-D: last line of file ends without a newline
  
  说文件最后一行没有换行结束,这是为什么了? 这里是keil 5 这样规定的没有为什么,记住行的文件最后一定要加上空行表示文件结束就可以了


到此项目错误警告全部解决 OK, 你可以根据自己的工程功能要求写逻辑实现代码了

(4) 看看编译过程输出显示的信息

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

  (2) 使用 armcc 编译 c/c++文件。编译后每个 c/c++源文件都对应有一个独立的.o 文件
  (3) 使用 armasm 编译汇编文件。编译后每个汇编源文件都对应有一个独立的.o 文件
   (4) 使用 armlink 链接对象文件,根据程序的调用把各个.o 文件的内容链接起来,最后生成程序的 axf 映像文件,并附带程序各个域大小的说明,包括 Code、RO-data、RW-data及 ZI-data 的大小。
  (5) 使用 fromelf 生成下载格式文件,它根据 axf 映像文件转化成 hex 文件,并列出编译过程出现的错误(Error)和警告(Warning)数量。
   (6) 最后一段提示给出了整个构建过程消耗的时间


当然了最后工程目录下Listings、OBjects下可以找到生成的各种文件:
每个 C 源文件都对应生成了.o、.d 及.crf 后缀的文件,还有一些额外的.dep、.hex、.axf、.htm、
.lnp、.sct、.lst 及.map 文件

每个文件的详细信息就不做解释了,感兴趣查阅哈资料即可

三、Code-data,RO-data,RW-data,ZI-data 介绍

  查看数输出信息发现了这么一串Program Size: Code=320 RO-data=252 RW-data=0 ZI-data=1632 他们分别是什么了?接下来进行讲解演示:

点击到这里来详细解释

四、最后附带一张图,了解哈工程文件的简单含义

这篇关于浅谈Keil-MDK创建项目编译过程---Code-data,RO-data,RW-data,ZI-data的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/wct3344142/article/details/105342920
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/390191

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数