STM32底层(ARM芯片)启动全过程详解:编译、链接、启动

这些是我慢慢收集来的博客,集中做个整理,建议慢慢阅读,了解STM32的整个底层。

一 编译过程中产生的各种文件。

编译是最先执行的过程

这一篇博客讲了编译过程中生成的各种文件类型,第二篇是对几种数据的详细解释

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

谈谈Keil-MDK编译输出的:Code-data,RO-data,RW-data,ZI-data_rodata rwdata-CSDN博客

以下的前三篇是和我们直接相关的文件的概述,毕竟要烧录到板子上。第四篇是对map文件的描述,其是对编译后的文件的一个整体描述,建议打开自己编译的map文件对照看。

浅谈 *.axf,*.bin,*.hex 文件-CSDN博客

程序编译生成的Hex、Bin、axf和elf格式_将hex文件转成elf文件-CSDN博客

STM32 | hex文件、bin文件、axf文件的区别?_hex和bin文件的区别-CSDN博客

keil生成的map文件全面分析_keil map文件分析-CSDN博客

回顾一下C语言中各个变量在内存中的位置

详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段)【建议收藏】-CSDN博客

二 来看看几家主流的的编译器

ARM 之七 主流编译器(armcc、iar、gcc for arm)详细介绍

里面详细介绍了几家的编译器,keil中主要使用的是armcc。

三 SCT分散加载文件。

对于编译链上的各个工具,我们可以抽象一下,它们一个接一个被调用最后生成了bin文件,而控制它们编译细节的已经再makefile文件中定义好了,我们可以不用关心,这些已经没有必要太关注。而控制链接的分散加载文件却影响着我们最终生成的bin文件在板子上的内存分布。是必须要关注的。以下是分散加载文件的叙述。

这个系列的博客(8篇)详细讲了分散文件的使用(打开这个博客然后去从第一篇开始看)。我想说明一些我觉得非常重要的的东西。

分散加载(7)—输入节input section-CSDN博客

1 .在第七篇的3.1节,module select pattern的选择上: . ANY的优先级是最低的,要等其它的放完了,才会放它这里来。如下,假设某个执行域有以下的文件,得先执行test_file_a.o(+RO) ,再执行 .Any把剩下的RO放入其中。

 .ANY (+RO)
 test_file_a.o(+RO)     //test_file_a.0的数据放到这里,再经过.ANY把剩下的放到第一个执行域中

所以在默认的keil的分散加载文件中:


 
LR_IROM1 0x08000000 0x00020000  {    
  ER_IROM1 0x08000000 0x00020000  {  
	
   *.o (RESET, +First)       //匹配所有的目标文件,找到RESET段,放到该执行域的最前面
   *(InRoot$$Sections)     
   .ANY (+RO)               //把剩下的所有RO数据放到这里
  }
  RW_IRAM1 0x20000000 0x00005000  { 
   .ANY (+RW +ZI)   
  }
}

2 在第七篇的3.2节中,虽然输入节的选择它有5个选项,但是最常用的实际上只有第一个属性(就是选择RO,RW这些的),第二个属性 input_section_pattern(输入节适配器),该属性的作用是指定节区。我说下我的理解:节区也叫段,在汇编中节区就是通过AREA CODE readonly这样定义的区域(从MDK分散加载文件学习STM32启动流程),这里面有提到,启动文件中的栈堆区都是属于section. 而如果在C语言中不刻意区定义节区,它就是默认生成比如RO,RW这种section。所以在第八篇文章中,作者在C文件中用如下代码定义了新的节区,这会把这个函数所在的区域 code_ram_1节区看成一个和RO,RW,RESET同等地位的节区。

void test_func_A(u8 input) __attribute__((section("code_ram_1")));

只有在C文件中定义了一个有名字的节区,那么才能方便在分散文件通过指定目标文件以及节区名字来筛选该节区

 test_file_A.o(code_ram_1)

而如果要使用RO,RW,其前面必须加一个+号。自己指定的特定名字的节区就不用。

第五个属性 :section_properties

 Section_properties 可以是+FIRST、+LAST和OVERALIGN值。

(以下的部分的博客内容大致相同,但是每篇有一些自己的特殊的地方,建议慢慢读,就有有重复的也可以)

下面这个博客讲了如何在分散加载文件中配置不同的flash区域,RAM区。

SCT分散文件_sct分散加载文件-CSDN博客

下面的这个博客在第一节基本概率处讲了main函数中初始化的相关过程。 

 手把手带你玩转分散加载(附代码)-CSDN博客

下面的这个博客有一个实例    

sct分散加载文件格式与应用_sct文件-CSDN博客

分散加载的另外一个实际应用

stm32专题三十七:自动分配变量到指定 SRAM 空间-CSDN博客

下面的这个博客中规中矩,可以再看看

KEIL MDK链接脚本-分散加载文件sct_keil链接脚本.sct怎么写-CSDN博客

四 STM32的启动

第一篇和第三篇是把之前的全部串联一起。而第二篇启动文件则是对第一篇的补充。

从MDK分散加载文件学习STM32启动流程_cortex-m0 .sct文件-CSDN博客

15. 启动文件详解 — [野火]STM32库开发实战指南——基于野火霸天虎开发板 文档 (embedfire.com)

深入理解工具链-自己搭建STM32编程IDE_stm32 ide-CSDN博客

作者:payphone15423

物联沃分享整理
物联沃-IOTWORD物联网 » STM32底层(ARM芯片)启动全过程详解:编译、链接、启动

发表评论