stm32启动文件的一点疑惑
时间:10-02
整理:3721RD
点击:
分析stm32启动文件:
LDR R0, =SystemInit ;先调用SystemInit 函数
BLX R0
LDR R0, =__main ;再初始化用户堆栈
BX R0
在没有初始化好堆栈的情况下就直接调用SystemInit 函数,这样怎么还能正常运行呢....?
LDR R0, =SystemInit ;先调用SystemInit 函数
BLX R0
LDR R0, =__main ;再初始化用户堆栈
BX R0
在没有初始化好堆栈的情况下就直接调用SystemInit 函数,这样怎么还能正常运行呢....?
芯片在制作好了之后有一部分的地址是被占用的,不能存入其他后来内容,这里放的就是MCU的内核指令,例如:x86指令集、x64指令集、sse指令集、mmx指令集等,在硬件系统复位后,这些地址内部存入的指令集就至位好了。而SystemInit 函数只是给这些指令集做一个引用,映射到操作系统里面。而且你看到的只是写成的代码,编译后的代码你并看不见。就如同c编译的程序是先执行include的引用内容还是,先执main里面的内容?
嗯,明白。SystemInit??函数是c语言编写的,编译器会自动完成入栈和出栈处理,无非是使用stmfd、ldmfd指令,这些指令一定要用到栈指针寄存器sp,问题是调用SystemInit??函数时还没有完成栈的设置,那么此时sp中的值是未知的,这样难道不会出错吗?
sp值不一定是未知的,象在51里,sp缺省值好像就是0x07,这个要查sp寄存器在复位后的复位值是多少