单片机执行第一步是从启动文件执行的,首先是堆栈的分配,然后是中断向量
的一些参数,还有系统时钟配置,这些都在启动文件里完成,最后才跳到主函数里面运行程序
虽然在裸开发中,并没有操作系统参与,但为了方便程序开发,在相应的编译处理中,其实都有一部分通用的处理,即在main函数真正启动之前,有一部分的基础化处理已经完毕,这就是所谓的启动代码部分,它提供一定的标准化处理来方便主要程序部分的构建开发,主要就涉及 内存空间的预分配(堆、栈的分配、中断向量空间的分配等等),还涉及系统时钟配置等等,正因为有了这些,后续开发就有了一定的基础条件。
当然,这段启动代码理论上也是可以自行开发的,从而让后续开发遵从不同的规范,但就需要涉及对相应架构(特别是MCU)资源的全面掌控,这就基本上算是寄存器开发啦,很是复杂,对一般开发者而言也没有必要啦。所以这部分开发其实更多的是直接利用官方提供的版本。这样就遵从其相应规范来开发,这样一来还带来了移植更方便的有优势。
这部分代码是存储程序运行过程中的一些变量的,还有中断向量,中断现场保存的功能
是要编译器进行分配的
堆就是alloc系列函数分配空间时使用的,栈是局部变量使用的,都可以视为是内存的一部分
STM32启动代码中需要将内存一部分分配给堆栈,这个堆栈,是使用高级编程语言如C C++等必备的,否则无法实现局部变量与内存动态分配,所有的处理器在跳转到高级编程语言编译出的代码前都要初始化堆栈,这个初始化堆栈及之前的语句必须用汇编实现