浅谈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

相关文章

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与