首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
数据库
›
Oracle
›
STM32 __main
返回列表
发新帖
STM32 __main
[复制链接]
发表于 2025-9-2 04:01:17
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
STM32开发中__main与用户main()函数的本质区别及工作机制
在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别负担
运行时初始化
和
用户步伐入口
的职责。以下是它们的焦点差异及协作机制:
一、定义与层级差异
__main函数
定位
:属于C/C++运行时库的初始化入口,由编译器自动生成,开发者不可见。
作用
:完成从加载域(Flash)到执行域(RAM)的
代码
和数据段拷贝、初始化ZI(零初始化)段、设置堆栈,并终极跳转至用户main()函数。
调用链
:启动文件(如startup_stm32fxxx.s)中的复位停止服务步伐调用__main,再由__main触发__rt_entry进入用户main()。
用户main()函数
定位
:开发者编写的步伐入口,负责硬件初始化(如HAL库设置)和业务逻辑。
可见性
:需显式定义,若缺失会导致链接错误(尤其在调用B __main时)。
二、启动流程对比
阶段__main函数的作用用户main()的作用
体系初始化
1. 拷贝
代码
段(RO)和数据段(RW)到RAM;
2. 清零ZI段;
3. 初始化堆栈无(此时尚未执行)
运行时情况准备
调用__rt_entry完成C库初始化(如标准IO、内存分配)无
用户步伐执行
跳转至main()1. 初始化外设(如GPIO、时钟);
2. 启动主循环或
任务调度
三、关键技术细节
段拷贝的须要性
在复杂体系中,
代码
的
加载地点
(Flash
存储
位置)与
执行地点
(RAM运行位置)不同。例如,停止服务步伐若需快速响应,需从Flash拷贝到RAM执行。__main自动处理惩罚此过程,而直接跳转B main会跳过段拷贝,需手动实现。
堆栈初始化
__main通过链接脚本(如.ld文件)定义的Stack_Size初始化主堆栈指针(MSP),确保函数调用和停止处理惩罚的
安全
。
调试观察差异
使用B __main调试时,会先执行库初始化代码(约几十毫秒),再进入用户main();而B main直接跳转,但可能导致未初始化的内存错误。
四、实际开发中的注意事项
启动文件设置
在STM32CubeMX生成的启动文件中,默认使用B __main进入初始化流程。若需自定义启动(如无操作体系裸机项目),需确保链接脚本精确设置加载/执行域。
ZI段清零的紧张性
未初始化的全局变量位于ZI段,若__main未清零该区域,变量值可能为随机值,导致步伐行为异常。
IAP升级的特殊处理惩罚
在Bootloader跳转至APP时,需手动重定位停止向量表(通过SCB->VTOR),并确保__main已精确初始化APP的运行时情况。
五、示例代码分析
#include "stm32f10x.h"
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); //
配置
系统时钟
MX_GPIO_Init(); // 初始化GPIO
while (1) { // 主循环
// 业务逻辑
}
}
复制代码
此代码中,HAL_Init()等函数依靠__main已完成的堆栈和内存初始化。若直接使用B main跳过__main,这些函数可能因未初始化情况而崩溃。
总结
__main与用户main()是STM32启动过程中
不可分割的协作环节
:前者为C步伐构建
安全
的执行情况,后者在此情况上实现业务逻辑。理解两者差异,可避免内存错误、初始化遗漏等题目,尤其在移植代码或优化启动速度时至关紧张。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复
使用道具
举报
返回列表
王海鱼
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表