iar stm32 启动代码片段分析
今天查看了 iar 上面的启动文件,好奇堆栈指针到底是什么时候赋值的,所以就仔细的阅读了代码和相关手册,找到了答案。
首先,芯片启动后,会从ROM的首地址处进行执行,那么我们从 linker 里面找找具体是怎么安排的。
/* 起始地址标签 */
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/* iar 代码块绝对地址定位: intvec块 和 StartCode 块 */
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec ,readonly section .StartCode};
再来看下启动代码:
/* NOROOT 表示如果没有被其他地方用到,就可以抛弃掉 */
/* 这边就是 intvec块 */
SECTION .intvec:CODE:NOROOT(2)
SECTION CSTACK:DATA:NOROOT(3)
/* Extern ... */
// Extern
/* DATA 模式 */
DATA
__vector_table
/* MSP 赋值 */
DCD sfe(CSTACK)
/* pc 赋值 */
DCD Reset_Handler ; Reset Handler
/* 后续指令解释为 thumb 执行模式的指令 */
THUMB
PUBLIC Reset_Handler
/* 这边就是 StartCode 块 */
SECTION .StartCode:CODE:NOROOT(2)
Reset_Handler
LDR R0, =__low_level_init
BLX R0
LDR R0, =__iar_program_start
BX R0
END
从上面可以看出来,程序先读取了 sfe(CSTACK), 然后进入 Reset_Handler 中执行 __low_level_init,最后执行 __iar_program_start 进入 main 函数。
查了手册,sfe 表示 section end,是说 CSTACK 的结束地址的后一个地址。那么在到 linker 文件里面看看是怎么写的:
define symbol __ICFEDIT_region_RAM_start__ = 0x20000200;
/* cstack 大小 0x200 */
define symbol __ICFEDIT_size_cstack__ = 0x200;
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
/* ram 中排列顺序: readwrite, cstack, heap */
place in RAM_region { readwrite,
block CSTACK,block HEAP};
然后我们再编译一下程序,看看 readwrite 使用的大小:
6 903 bytes of readwrite data memory
经过测试发现,6903 这个数值已经包含了 cstack 的部分,所以我们计算一下:
那么 6903 +0x20000200 + 1 = 0x20001CF8。
然后模拟调试一下,看看 SP 的数值, 确实是 0x20001CF8。
iar stm32 启动代码片段分析的更多相关文章
- STM32启动代码详细分析
最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义自见,因此我有看了一遍,下面的文章,挺好的,因此转载: 在上电复位后,我们都知道会先运行启动代码 ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- STM32启动代码分析
STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在<<STM32不完全手册里面>>,我们所有的例程都采用了一个叫STM32F10x.s的启动文 ...
- STM32启动代码分析及其汇编学习-ARM
STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...
- STM32 启动代码 bootloader
什么是启动代码? 启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码.STM32的启动代码在startup_stm32f10x_hd.s 启 ...
- Cortex-M0(NXP LPC11C14)启动代码分析
作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...
- SpringBoot启动代码和自动装配源码分析
随着互联网的快速发展,各种组件层出不穷,需要框架集成的组件越来越多.每一种组件与Spring容器整合需要实现相关代码.SpringMVC框架配置由于太过于繁琐和依赖XML文件:为了方便快速集成第三 ...
- 通过从代码层面分析Linux内核启动来探知操作系统的启动过程
通过从代码层面分析Linux内核启动来探知操作系统的启动过程 前言说明 本篇为网易云课堂Linux内核分析课程的第三周作业,我将围绕Linux 3.18的内核中的start_kernel到init进程 ...
- ARM Linux启动代码分析
前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...
随机推荐
- Spring Cloud(Dalston.SR5)--Hystrix 监控
在服务调用者加入 Actuator ,可以对服务调用者的健康情况进行实时监控,例如,断路器是否打开.当前负载情况等. 服务调用者 需要增加 actuator依赖, 修改 POM.xml 中增加以下依赖 ...
- golang里json的处理配合struct是相当方便
type Feed struct { Name string `json:"site"` URI string `json:"link"` Type strin ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程 -参考自http://lavasoft.blog.51cto.com/62575/1104993/
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
- 持续集成之Jenkins+Gitlab实现持续集成 [二]
持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建 General 源码管理 我们安装的是Git插件,还可以安装svn插件 我们将 ...
- Azure SQL 数据库仓库Data Warehouse (1) 入门
<Windows Azure Platform 系列文章目录> 在之前的项目中遇到了客户使用SQL数据仓库的场景,在这里记录一下 1.什么是SQL 数据库仓库 (SQL DW) SQL D ...
- idea下的调试配置
react和ts的整合 https://github.com/Microsoft/TypeScript-React-Starter vue的 https://github.com/ducksoupde ...
- Python入门 [输出,注释,列表,元祖,集合,字典,if,while,for]
print("Hello Python") #输出 ''' 多行注释 用 三个引号 ''' a=1 #赋值 变量首字母只能书字母下划线 第二个字符数字,字母,下划线 声明一个列表 ...
- DEVC怎么建工程
1.DEVC建工程 1.1 新建项目 打开文件,选择新建-->项目-->ConsoleApplication(控制台程序),输入项目名,选择保存路径.(单独建一个文件夹存放) 项目建成功后 ...
- ALGO-14_蓝桥杯_算法训练_回文数
问题描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
- 【linux】安装docker
硬件Centos6.9 x86_64 1.查看centos内核,uname -r 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64 ...