在学习STM32的时候一直看不明白Startup_stm32f40_41xxx.s这个文件。里边写的每句话好像也能看懂但是就不知道他想干嘛。现在终于有点体会了所以来在这里记录下来,希望能对后来的人有帮助。
1、首先启动代码要确定的是都用汇编来写,因为C语言是不能实现的。这个原因是因为C语言想要运行必须要有堆栈的支持,如果没有堆栈(这里最重要的是栈,因为堆可能不需要)那么C程序运行后就会指向了一个不知道什么地方的地方就会出错程序就跑飞了。从这里看C不是不能执行是执行了就肯定会出错。因此必须要用汇编来给C搭建好栈空间好让他正确执行。
2、启动代码也并不是所有的硬件都需要,比如我们用C51的时候就没有看到这个启动代码,上来就用C来写程序了。这是因为C51的硬件内部完成了c所需要的栈所以能执行,还有就是普通PC,他的启动代码是在BIOS(BIOS应该是一块很小的NorFlash吧,好像记得是)里烧写好了他做的启动工作里有一部分肯定是栈和堆的初始化。STM32的启动代码是厂家给你写好的可以看到开头就有如下内容
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
可以看到大小是1K的一个栈直接初始化了CPU的SP指针也就是说把栈初始化好了。因为在ARM中SP就是r13随便上网查一下就知道了。
还用STM32的启动代码来说接着就是异常向量表,这个不用管这是硬件规定好的名字你想改也不能改(最多也就是用#define来包装一层),之后就是Reset_Handler这个标签也就可以认为是C中的函数吧。跟着是
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
跳转到SystemInit因为用的是BL所有能返回来,在调用就是我们写的main函数了用bx调用所有就不用返回了。
3、总结一下也就是说一般这种嵌入式或者是单片机的启动代码一般只做时钟初始化、关闭看门狗(可能有的CPU硬件里边已经给你做了)、还有就是初始化栈和堆接着就可以跑你的C程序了。也就是加载bootloder和操作系统什么的吧。
转载于:https://blog.51cto.com/13638458/2347681