浅谈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-dataCode-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,会弹出一个框按下图操作即可,得到启动文件
(3) 初识工程常见一串错误分析
既然前面工程已经搭建完美,首先我们来编译一下
(4) 看看编译过程输出显示的信息
三、Code-data,RO-data,RW-data,ZI-data 介绍
查看数输出信息发现了这么一串Program Size: Code=320 RO-data=252 RW-data=0 ZI-data=1632
他们分别是什么了?接下来进行讲解演示:
点击到这里来详细解释
四、最后附带一张图,了解哈工程文件的简单含义