浅谈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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390191

相关文章

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装