You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KEIL中__main函数的执行操作及初始化规则问询

__main函数在用户main()执行前的具体操作

__main是ARM系列编译器(如Keil MDK的ARMCC/ARMCLANG)提供的启动阶段入口函数,会在用户编写的main()运行前自动执行,核心操作如下:

  • RW变量复制:将存储在Flash中的RW(读写属性)全局/静态变量,完整复制到RAM的指定区域——因为Flash是只读介质,RW变量需要可读写空间,这一步是必须的。
  • BSS段清零:把BSS段(未初始化的全局/静态变量区域)的所有字节置为0,符合C语言标准中未初始化静态变量默认值为0的要求。
  • 栈与堆的初始化:
    • 栈的基础初始化通常在更早的启动汇编代码完成,但__main会确认栈指针的合法性;
    • 堆的初始化是__main的关键操作,会根据工程配置(或分散加载文件)设置堆的起始地址和大小,为后续malloc、free等动态内存操作提供可用空间。
  • 运行时环境初始化:
    • 初始化编译器依赖的运行时组件,比如启用FPU后的浮点运算库;
    • 执行全局构造逻辑:包括C++中静态对象的构造函数,以及C语言里用__attribute__((constructor))标记的初始化函数。
  • 分散加载规则执行:如果工程中使用了分散加载文件(Scatter File)来自定义内存区域划分(比如指定某部分变量到特定RAM块、代码到不同Flash分区),__main会严格遵循分散加载文件的定义,完成对应区域的RW复制、BSS清零等操作,保证每个内存区域的变量都被正确初始化到指定位置。

内容的提问来源于stack exchange,提问作者George Ma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:55:51