我是靠谱客的博主 落后音响,最近开发中收集的这篇文章主要介绍ARM启动代码中_main 与用户主程序main()的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

Reset_Handler
PROC
EXPORT
Reset_Handler
[WEAK]
IMPORT
__main
LDR
R0, = __main
BX
R0
ENDP

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

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

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

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

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

最后

以上就是落后音响为你收集整理的ARM启动代码中_main 与用户主程序main()的区别的全部内容,希望文章能够帮你解决ARM启动代码中_main 与用户主程序main()的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部