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,那么 ...
随机推荐
- ecstore-安装提示flock,即使绕过检测,安装成功后还是提示t function 解决办法
安装时先绕过去 安装好后,修改config.php里的TMP_DIR,指向网站目录下的data目录(用绝对路径) 分析:应该是php的运行用户没有对tmp目录的写权限.中电云集的管理工具就出现过
- 【java】for循环嵌套
循环嵌套:外循环控制行数,内循环控制每一行的列数,也就是每一行的元素个数 需求:打印出9*9的乘法表 class Demo { public static void main(String[] arg ...
- DS二叉树--二叉树之父子结点
题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构. 编写程序输出该树的所有叶子结点和它们的父亲结点 输入 第一 ...
- CentOS7切换到root用户和退回普通用户
切换成root用户: sudo su - 退出root用户并切换回普通用户: exit
- 【Java】线程转储分析 ThreadDump
[[TOC]] 通过分析 ThreadDump 来查询Java程序运行情况 获取线程转储文件 有多种方式可以获取转储文件,可参考链接HOW TO TAKE THREAD DUMPS? – 8 OPTI ...
- Consul之:key/value存储
key/value作用 动态修改配置文件 支持服务协同 建立leader选举 提供服务发现 集成健康检查 除了提供服务发现和综合健康检查,Consul还提供了一个易于使用的键/值存储.这可以用来保存动 ...
- 大数据:Parquet文件存储格式【转】
一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...
- Jmeter(十五)Logic Controllers 之 while Controller
while Controller是控制循环的Controller,条件判断的Controller.先看看官方Demo. while Controller控制它的子对象,直到false为止.并且还提供了 ...
- [UE4]世界坐标、本地坐标
本地坐标 世界坐标
- Linux在线安装git
一.先检测是否已安装git#rpm -qa | grep zlib-devel 二.提前 安装gcc#yum install gcc 三.具体安装命令 Git下载路径:https://www.kern ...