当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/326863.html

相关文章:

  • 曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)
  • 深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析
  • Python学习之-正则表达式
  • Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能
  • 数据仓库——雪花模式以及层次递归
  • Transformer的前世今生 day09(Transformer的框架概述)
  • Qt 压缩/解压文件
  • 【leetcode刷题之路】面试经典150题(8)——位运算+数学+一维动态规划+多维动态规划
  • JetBrains全家桶激活,分享 WebStorm 2024 激活的方案
  • Sublime 彻底解决中文乱码
  • 复旦大学EMBA校友出席两会建言献策助力中国发展
  • virtualbox导入vdi
  • 【信号处理】基于DGGAN的单通道脑电信号增强和情绪检测(tensorflow)
  • 使用 Docker Compose 部署 Spring Boot 应用
  • nginx 正向代理 https
  • vue3从其他页面跳转页面头部组件菜单el-menu菜单高亮
  • python 条件循环语句
  • CIM搭建实现发送消息的效果
  • C++第十三弹---内存管理(下)
  • Python爬虫学习完整版
  • JavaScript中的继承方式详解
  • Git基础(23):Git分支合并实战保姆式流程
  • 为什么有些前端一直用 div 当按钮,而不是用 button?
  • python实战之基础篇(一)
  • 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(补题)
  • 蓝桥杯刷题--python-32
  • 单例模式如何保证实例的唯一性
  • IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)
  • 【教程】iOS如何抓取HTTP和HTTPS数据包经验分享
  • 基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告