stm32启动文件里面的__main和主函数main()

一、__main和main()之间的关系

先来对stm32启动过程简单学习

启动文件里面的Reset_Handler:

调用过程:

stm32在启动后先进入重启中断函数Reset_Handler,其中会先后调用SystemInit和__main函数,

__main函数属于c库函数,其内部依次进行三步工作,即先初始化rw段,然后初始化zi段,最后调用另一个c库函数__rt_entry(),

__rt_entry()该函数先初始化堆栈和库函数,然后即调用主函数main(),从而进入用户程序。可以看出主函数main()若退出,则在__rt_entry()最后会再调用exit()函数进行退出操作。

__main和__rt_entry这俩函数实际上我都没能力进的去,我也是找网上大神逆向分析出来的"借鉴"学习一下

总结:stm32启动文件里面Reset_Handler最后调用了__main,而在__main里面最后调用了__rt_entry(),然后__rt_entry()在做完堆栈和库函数初始化工作之后才调用main()。

二、修改主函数名称的方法

Reset_Handler中导入和执行的__main函数换成自己在c文件里随便定义的函数即可,比如上图的testmain,我现在就是把在c文件里面定义的testmain函数作为主函数来用的。注意这里有个误区,有的人可能会将__main换成比如__testmain,然后实际自己定义的是testmain,这样编译肯定通不过,然后就说什么stm32的主函数名改不了。因为__testmain没有定义啊,这个和__main不一样,main是c的库函数,标准库自己包含的,它是在内部调用的main(),而不是编译过程给它去掉了两个下划线

但由于__main函数除了调用main()以外在前后还有初始化堆栈和库函数、调用exit()的操作,而我这里直接把__main函数替换成自己想要运行的函数则不包含那些操作,换句话说启动文件前面设置的堆和栈大小都白设置了,库里面有的值如果有设置的也白设置了,现在都成了默认的值,还有exit()里面有啥特别的用处也不了解,等于把一个本来该有但未知用途的模块删了,这肯定是不行的。因此在stm32平台上尽量还是不要自己擅自修改main函数名称。

Linux main启动参考:主函数main和程序入口_start

相关推荐
齐齐大魔王25 分钟前
关于 安装串口CH340、CH341驱动预安装成功,但是不显示端口问题
stm32·单片机·嵌入式硬件
LingLong_roar27 分钟前
普冉单片机PY32F002AF15P6TU + 0.96寸TFT ST7735s 80*160显示屏,使用软件SPI进行颜色填充
单片机·嵌入式硬件
楼兰公子1 小时前
SoC嵌入式硬件设计:原理图搭建与PCB画板系统教学(KiCad 10.0版)
嵌入式硬件·kicad
LCG元1 小时前
STM32实战:基于STM32F103的智能充电器(电压电流检测+PWM)
stm32·单片机·嵌入式硬件
feifeigo1231 小时前
汽车CAN J1939协议完整编程源码和STM32移植指南
stm32·嵌入式硬件·汽车
LCG元2 小时前
STM32实战:基于OpenMV与STM32的智能视觉追踪小车(颜色识别+舵机控制)
stm32·单片机·嵌入式硬件
星夜夏空992 小时前
STM32单片机学习(13) —— 串口通信协议
stm32·单片机·学习
崇山峻岭之间2 小时前
单片机时钟配置:HSE改为HSI
单片机·嵌入式硬件
QH139292318802 小时前
思仪 Ceyear 5256C 5G 终端综合测试仪
单片机·单元测试·集成测试·嵌入式实时数据库
jake·tang2 小时前
深度解析 VESC 参数辨识源码:电阻、电感与磁链
arm开发·c++·嵌入式硬件·算法·数学建模·傅立叶分析