main 函数不是整个系统的启动函数系统启动的时候会先调用系统初始化库函数 SystemInit( )
/**
* ARM汇编中的复位中断处理函数(Reset Handler),系统启动时第一个执行的函数,负责初始化系统并跳转到主程序 $Sub$$main,进入C环境
*/
Reset_Handler PROC ; 定义该函数的过程开始,当芯片复位(上电或复位信号触发)时,CPU 会首先执行此函数
EXPORT Reset_Handler [WEAK] ; 导出符号供其他文件调用,[WEAK] 表示弱定义(可被用户强定义覆盖),如果用户在其他文件中定义了同名的 Reset_Handler,链接时会优先使用用户定义的版本(覆盖此处的默认实现)
IMPORT __main ; 声明外部符号 __main(C库入口,负责初始化C运行时环境),C 库的入口函数,负责初始化全局变量、堆栈等 C 运行时环境
IMPORT SystemInit ; 声明外部符号 SystemInit(系统初始化函数,如时钟、内存配置),系统初始化的库函数,由芯片厂商在system_stm32f1xx.c中实现,用于配置时钟、初始化内存控制器等硬件
LDR R0, =**SystemInit** ; 将 SystemInit 函数的地址加载到寄存器 R0
BLX R0 ; CPU跳转到 SystemInit 执行(并 保存返回地址 到 链接寄存器LR,BLX 支持ARM/Thumb指令集切换),执行完该函数之后,CPU 会返回到 BLX 的下一条指令继续执行
LDR R0, =**__main** ; 将 __main 函数的地址加载到寄存器 R0
BX R0 ; CPU跳转到 __main(不再返回,进入C世界),与 BLX 的区别:1. BX 不保存返回地址,因为进入 __main 后程序将完全移交到 C 环境
ENDP ; 定义该函数的过程结束 2. __main 会初始化 C 运行时环境(如复制数据段、清零 BSS 段),最后调用用户的 main 函数
$Sub$$main 函数 中开始启动,因为该 main 函数调用了系统启动函数 rtthread_startup()
所以在一些项目中,如果不是从该文件的该函数启动系统的,那么搜索是哪里调用了系统启动函数 rtthread_startup() 即可知道系统是从哪里启动的