首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
启动文件
📅 2026/10/10 6:09:07
✍️ 爱科研究院
👁 阅读 3,247
启动文件0. 它是谁、什么时候跑文件名startup_stm32f407xx.s汇编编写放在 MDK-ARM 目录下。上电复位后第一个执行的程序在main()之前。干 5 件事CPU 上电后从向量表第0项取栈指针、从第1项取 Reset_Handler 地址跳转 → 调SystemInit()→ 调__mainC 库初始化→ 跳进main()。1. 栈和堆Stack_Size EQU 0x00000400 ; 栈 1KB Heap_Size EQU 0x00000200 ; 堆 512B栈Stack堆Heap用途局部变量、函数调用、形参malloc()动态分配生长方向高地址 → 低地址低地址 → 高地址大小默认值1KB512B不够了会怎样溢出 → HardFaultmalloc 返回 NULL局部变量多了/递归深了栈不够会莫名其妙进 HardFault。遇到这种事先把Stack_Size改大。2. 向量表向量表就是一个函数地址数组存在 Flash 0 地址。__Vectors DCD __initial_sp ; 第0个栈顶地址不是函数 DCD Reset_Handler ; 第1个复位 DCD NMI_Handler ; 第2个不可屏蔽中断 DCD HardFault_Handler ; 第3个硬错误 ... DCD WWDG_IRQHandler ; 外部中断从这里开始 ...CPU 响应中断的机制中断号 × 4 → 到向量表里查对应地址 → 跳过去执行。位置内容说明0x00__initial_sp栈顶地址复位后直接加载到 SP0x04Reset_Handler复位后第一条要跑的代码0x08~0x3C系统异常NMI / HardFault / SVC / PendSV / SysTick 等0x40 起外部中断WWDG / PVD / 各种外设中断3. Reset_Handler复位后干了什么Reset_Handler PROC LDR R0, SystemInit ; ① 调 SystemInit() BLX R0 LDR R0, __main ; ② 调 __mainC 库初始化最终调你的 main BX R0 ENDPSystemInit()在system_stm32f4xx.c里。HAL 工程里它不配时钟只做 FPU 使能、向量表地址设置、外部 SRAM 配置。时钟靠你自己写的SystemClock_Config()见 4. 时钟.md 第6节。__mainC 库函数初始化堆和栈然后跳进你的main()。4. WEAK弱定义——最关键的概念启动文件里所有中断服务函数都是空实现标了[WEAK]NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ; 死循环 ENDP规则你在 C 文件里写了同名函数比如void SysTick_Handler(void) {}→ 用你的。没写 → 用这个空的死循环。后果开了中断但忘了写中断服务函数 / 函数名拼错 → 中断来了直接跳进这个死循环程序卡死。你自己写中断函数时名字必须和向量表里的完全一致如USART1_IRQHandler错一个字母就等于没写。5. 常用汇编指令速查指令作用EQU给常量起名字相当于 C 的#defineSPACE分配内存单位字节DCD以字为单位分配并初始化内存向量表用它存函数地址EXPORT把本文件的标号导出给别的模块用相当于 C 里非 static 的全局定义对外可见IMPORT声明标号来自外部文件相当于 C 的extern引用B跳转。B . 跳到自己 死循环BLX跳转到函数并保存返回地址WEAK弱定义不是 ARM 指令是编译器伪指令ALIGN地址对齐6. MicroLIBKeil 里 Target 选项卡勾的 Use MicroLIB对应的就是启动文件里的__MICROLIB宏IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE ; 不勾 MicroLIB 时需要用户自己实现 __use_two_region_memory ENDIF勾了Keil 自带精简 C 库启动文件直接导出栈顶/堆起止地址省事。不勾用标准 C 库需要自己实现__use_two_region_memory。嵌入式开发一般都勾 MicroLIB代码小、启动快。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/10 6:09:07
生物计算测试的六维伦理责任:从数据隐私到职业操守
2026/10/10 6:09:07
磁盘未分配数据恢复,分区消失文件这样找回
2026/10/10 6:09:07
GEO信任机制:企业内容如何通过大模型权威审核
2026/10/10 7:04:10
手写C子集编译器:词法分析到MIPS生成全链路实现
2026/10/10 7:04:10
DeepSeek自动化生成脚本与单元测试:从需求描述到覆盖率检查的完整指南
2026/10/10 7:04:10
伴随灵敏度分析实战:Matlab求解肿瘤生长PDE优化与时空放疗梯度
2026/10/10 7:04:10
WPS表格分类汇总全攻略:排序、透视表与SUMIFS自动模板
2026/10/10 7:04:10
DeepSeek自动化生成Python脚本与单元测试实战指南
2026/10/10 6:59:09
Windows登录国密UKey双因子认证改造:从证书到登录的落地实践
2026/10/10 0:03:38
工业软件标准化路线图:国产替代的落地施工图
2026/10/10 0:03:38
VCMI安卓版实操指南:原生运行英雄无敌3的3步技术落地
2026/10/10 0:03:38
稀疏多通道盲反褶积的MATLAB算法实现与参数调优
2026/10/10 3:42:06
Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化
2026/10/10 3:42:01
多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系
2026/10/10 3:41:58
hindsight:面向LLM应用的事后可观测性工程实践
2026/10/10 3:41:56
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/10 3:41:54
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/9 11:36:17
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)