今天查看了 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 启动代码片段分析的更多相关文章

  1. STM32启动代码详细分析

    最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义自见,因此我有看了一遍,下面的文章,挺好的,因此转载: 在上电复位后,我们都知道会先运行启动代码 ...

  2. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

  3. STM32启动代码分析

    STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在<<STM32不完全手册里面>>,我们所有的例程都采用了一个叫STM32F10x.s的启动文 ...

  4. STM32启动代码分析及其汇编学习-ARM

    STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...

  5. STM32 启动代码 bootloader

    什么是启动代码?     启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码.STM32的启动代码在startup_stm32f10x_hd.s 启 ...

  6. Cortex-M0(NXP LPC11C14)启动代码分析

    作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...

  7. SpringBoot启动代码和自动装配源码分析

    ​ 随着互联网的快速发展,各种组件层出不穷,需要框架集成的组件越来越多.每一种组件与Spring容器整合需要实现相关代码.SpringMVC框架配置由于太过于繁琐和依赖XML文件:为了方便快速集成第三 ...

  8. 通过从代码层面分析Linux内核启动来探知操作系统的启动过程

    通过从代码层面分析Linux内核启动来探知操作系统的启动过程 前言说明 本篇为网易云课堂Linux内核分析课程的第三周作业,我将围绕Linux 3.18的内核中的start_kernel到init进程 ...

  9. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

随机推荐

  1. Spring Cloud(Dalston.SR5)--Hystrix 监控

    在服务调用者加入 Actuator ,可以对服务调用者的健康情况进行实时监控,例如,断路器是否打开.当前负载情况等. 服务调用者 需要增加 actuator依赖, 修改 POM.xml 中增加以下依赖 ...

  2. golang里json的处理配合struct是相当方便

    type Feed struct { Name string `json:"site"` URI string `json:"link"` Type strin ...

  3. 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 ...

  4. 持续集成之Jenkins+Gitlab实现持续集成 [二]

    持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将 ...

  5. Azure SQL 数据库仓库Data Warehouse (1) 入门

    <Windows Azure Platform 系列文章目录> 在之前的项目中遇到了客户使用SQL数据仓库的场景,在这里记录一下 1.什么是SQL 数据库仓库 (SQL DW) SQL D ...

  6. idea下的调试配置

    react和ts的整合 https://github.com/Microsoft/TypeScript-React-Starter vue的 https://github.com/ducksoupde ...

  7. Python入门 [输出,注释,列表,元祖,集合,字典,if,while,for]

    print("Hello Python") #输出 ''' 多行注释 用 三个引号 ''' a=1 #赋值 变量首字母只能书字母下划线 第二个字符数字,字母,下划线 声明一个列表 ...

  8. DEVC怎么建工程

    1.DEVC建工程 1.1 新建项目 打开文件,选择新建-->项目-->ConsoleApplication(控制台程序),输入项目名,选择保存路径.(单独建一个文件夹存放) 项目建成功后 ...

  9. ALGO-14_蓝桥杯_算法训练_回文数

    问题描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  10. 【linux】安装docker

    硬件Centos6.9 x86_64 1.查看centos内核,uname -r 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64 ...