×
单片机 > 单片机程序设计 > 详情

ARM启动代码中_main 与用户主程序main()的区别

发布时间:2020-12-11 发布时间:
|

STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数。


跳转具体到代码段部分如下:


Reset_Handler   PROC  

                EXPORT  Reset_Handler             [WEAK]  

                IMPORT  __main  

                LDR     R0, = __main  

                BX      R0  

                ENDP  

当您看到__main函数时,估计应该有不少人认为这个是main函数的别名或是编译之后的名字,否则在启动代码中再也无法找到和main相关的字眼了。可事实是,__main和main是完全两个不同的函数,并且你无法找到__main代码,因为这个是编译器自动创建的。


查看MDK的文档,会发现有这么一句说明:It is automatically created by the linker when it sees a definition of main()。简单点来说,当编译器发现定义了main函数,那么就会自动创建__main。


程序经过汇编启动代码,执行到__main(),之后会执行两个大的函数:


__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。


__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。



注意:有些应用中会要求在进入main函数之前先初始化一些外设或者变量区,如:初始化时钟、初始化SDRAM。在初始化他们的时候一定不要使用全局变量,部分库函数,HAL库。因为在__main之前,全局变量还没有初始化,使用会异常,甚至发生内存错误。因此建议使用寄存器来初始化。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址