STM32 __main

STM32开发中__main与用户main()函数的本质区别及工作机制

在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别承担运行时初始化用户程序入口的职责。以下是它们的核心差异及协作机制:


一、定义与层级差异
  1. __main函数

    • 定位​:属于C/C++运行时库的初始化入口,由编译器自动生成,开发者不可见。
    • 作用​:完成从加载域(Flash)到执行域(RAM)的代码和数据段拷贝、初始化ZI(零初始化)段、配置堆栈,并最终跳转至用户main()函数。
    • 调用链​:启动文件(如startup_stm32fxxx.s)中的复位中断服务程序调用__main,再由__main触发__rt_entry进入用户main()
  2. 用户main()函数

    • 定位​:开发者编写的程序入口,负责硬件初始化(如HAL库配置)和业务逻辑。
    • 可见性​:需显式定义,若缺失会导致链接错误(尤其在调用B __main时)。

二、启动流程对比
阶段__main函数的作用用户main()的作用
系统初始化1. 拷贝代码段(RO)和数据段(RW)到RAM;
2. 清零ZI段;
3. 初始化堆栈
无(此时尚未执行)
运行时环境准备调用__rt_entry完成C库初始化(如标准IO、内存分配)
用户程序执行跳转至main()1. 初始化外设(如GPIO、时钟);
2. 启动主循环或任务调度

三、关键技术细节
  1. 段拷贝的必要性

    • 在复杂系统中,代码的加载地址​(Flash存储位置)与执行地址​(RAM运行位置)不同。例如,中断服务程序若需快速响应,需从Flash拷贝到RAM执行。__main自动处理此过程,而直接跳转B main会跳过段拷贝,需手动实现。
  2. 堆栈初始化

    • __main通过链接脚本(如.ld文件)定义的Stack_Size初始化主堆栈指针(MSP),确保函数调用和中断处理的安全。
  3. 调试观察差异

    • 使用B __main调试时,会先执行库初始化代码(约几十毫秒),再进入用户main();而B main直接跳转,但可能导致未初始化的内存错误。

四、实际开发中的注意事项
  1. 启动文件配置

    • 在STM32CubeMX生成的启动文件中,默认使用B __main进入初始化流程。若需自定义启动(如无操作系统裸机项目),需确保链接脚本正确配置加载/执行域。
  2. ZI段清零的重要性

    • 未初始化的全局变量位于ZI段,若__main未清零该区域,变量值可能为随机值,导致程序行为异常。
  3. IAP升级的特殊处理

    • 在Bootloader跳转至APP时,需手动重定位中断向量表(通过SCB->VTOR),并确保__main已正确初始化APP的运行时环境。

五、示例代码分析
#include "stm32f10x.h"
int main(void) {HAL_Init();              // 初始化HAL库SystemClock_Config();    // 配置系统时钟MX_GPIO_Init();          // 初始化GPIOwhile (1) {              // 主循环// 业务逻辑}
}

此代码中,HAL_Init()等函数依赖__main已完成的堆栈和内存初始化。若直接使用B main跳过__main,这些函数可能因未初始化环境而崩溃。


总结

__main与用户main()是STM32启动过程中不可分割的协作环节​:前者为C程序构建安全的执行环境,后者在此环境上实现业务逻辑。理解两者差异,可避免内存错误、初始化遗漏等问题,尤其在移植代码或优化启动速度时至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是PMBus

一、PMBus的定义与背景 PMBus(Power Management Bus,电源管理总线) 是一种基于SMBus(System Management Bus)的开放标准数字通信协议,专为电源设备的监控、配置和控制设计。由PMBus联盟(现并入…

Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法

Python方法类型全解析:实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景:具体应用场景:1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…

业务中台-典型技术栈选型(微服务、容器编排、分布式数据库、消息队列、服务监控、低代码等)

在企业数字化中台建设中,业务中台是核心支撑平台,旨在通过技术手段将企业核心业务能力抽象、标准化和复用,以快速响应前端业务需求。其核心技术流涉及从业务抽象到服务化、治理和持续优化的全流程。以下是业务中台建设中的核心技术体系及关键…

期望是什么:(无数次的均值,结合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(无数次的均值,结合概率)21/6=3.5 一、期望(数学概念) 在概率论和统计学中,**期望(Expectation)**是一个核心概念,用于描述随机变量的长期平均取值,反映随机变量取值的集中趋势。 (一…

matlab官方免费下载安装超详细教程2025最新matlab安装教程(MATLAB R2024b)

文章目录 准备工作MATLAB R2024b 安装包获取详细安装步骤1. 文件准备2. 启动安装程序3. 配置安装选项4. 选择许可证文件5. 设置安装位置6. 选择组件7. 开始安装8. 完成辅助设置 常见问题解决启动失败问题 结语 准备工作 本教程将帮助你快速掌握MATLAB R2024b的安装技巧&#x…

第3章 自动化测试:从单元测试到硬件在环(HIL)

在前两章中,我们已完成从环境搭建到流水线编译的自动化配置。为了真正保障软件质量、降低回归风险,本章将聚焦测试自动化,涵盖从最基础的单元测试,到集成测试,再到硬件在环(Hardware-in-the-Loop, HIL)测试的全流程。通过脚本驱动、测试报告可视化和与 CI 平台深度集成,…

信息收集+初步漏洞打点

目标:理解信息收集在渗透测试中的意义,熟悉常用工具用法,完成基本打点测试 一.理论学习: 模块内容说明信息收集分类主动信息收集 vs 被动信息收集目标发现子域名、IP、端口、子站点、目录、接口技术指纹识别Web框架(如…

uniapp+vue3开发项目之引入vuex状态管理工具

前言: 我们在vue2的时候常用的状态管理工具就是vuex,vue3开发以后,又多了一个pinia的选项,相对更轻便,但是vuex也用的非常多的,这里简单说下在uni-app中vuex的使用。 实现步骤: 1、安装&#x…

浅谈“量子计算应用:从基础原理到行业破局”

量子计算应用:从基础原理到行业破局 引言:量子计算为何成为科技革命新引擎? 量子计算利用量子力学原理(叠加态、纠缠态、量子干涉)突破经典计算的极限,在特定领域可实现指数级加速。根据中研普华预测,2025年全球量子计算市场规模将突破80亿美元,2035年可达8117亿美元。…

UNiAPP地区选择

<template> <view class"container"> <!-- 左侧地区列表 --> <scroll-view class"left-list" scroll-y :scroll-into-view"currentLetterId" scroll-with-animation scroll"…

嵌入式硬件篇---CAN

文章目录 前言1. CAN协议基础1.1 物理层特性差分信号线终端电阻通信速率总线拓扑 1.2 帧类型1.3 数据帧格式 2. STM32F103RCT6的CAN硬件配置2.1 硬件连接2.2 CubeMX配置启用CAN1模式波特率引脚分配过滤器配置&#xff08;可选&#xff09; 3. HAL库代码实现3.1 CAN初始化3.2 发…

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候&#xff0c;或者实际做企业级的产品落地的时候&#xff0c;你必…

机器学习 day04

文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习&#xff0c;我掌握了机器学习中的线性回归的相关基本概念&#xff0c;包括损失函数的概念&#xff0c;最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…

img.dims() <= 2 in function ‘cv::matchTemplate报错

Mat src mat_ori;//imread(img_original);Mat src_template imread(img_template);cvtColor(src, src, COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错cvtColor(src_template, src_template,COLOR_BGR2RGB);//不转换&#xff0c;matchTemplate将报错 error: (-215…

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…

exit耗时高

背景&#xff1a;程序退出发现被强制退出&#xff0c;而不是正常的退出。正常退出是发送15信号&#xff0c;而异常退出是发送信号9&#xff0c;强制退出。退出机制是先发送信号15&#xff0c;然后6s内没有退出完成&#xff0c;会发送信号9。通过查看退出流程&#xff0c;是将初…

docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令

docker compose 表示调用 Docker Compose 工具&#xff0c;用于管理基于 YAML 文件定义的多容器应用。 up 核心指令&#xff0c;作用是根据 docker-compose.yml 文件中的配置&#xff0c;创建并启动所有定义的服务、网络、卷等资源。 如果容器未创建&#xff0c;会先构建镜像&…

从辅助到协作:GitHub Copilot的进化之路

如果说现代程序员的标配工具除了VS Code、Stack Overflow之外&#xff0c;还有谁能入选&#xff0c;那一定是GitHub Copilot。从2021年首次亮相&#xff0c;到如今深度集成进开发者日常流程&#xff0c;这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了&#xff0c;而…

局部放大maya的视图HUD文字大小的方法

一、问题描述&#xff1a; 有网友问&#xff1a;有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗&#xff1f; 在 Maya 中&#xff0c;可以通过自定义 HUD&#xff08;Heads-Up Display&#xff09;元素的字体大小来局部放大特…

C++中隐式的类类型转换知识详解和注意事项

一、隐式转换的基本概念 隐式类型转换&#xff08;implicit conversion&#xff09;指编译器在需要时自动在两种类型之间插入转换代码&#xff0c;无需显式调用。对于内置类型&#xff08;如 int 到 double&#xff09;&#xff0c;转换由标准定义&#xff1b;对于用户自定义类…