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,那么 ...
随机推荐
- delphi 关于 "高位" 与 "低位"
Longint = Integer WPARAM = Integer LPARAM = Integer LRESULT = Integer FARPROC = Pointer function Mak ...
- 将Word,PDF文档转化为图片
#region 将Word文档转化为图片 /// <summary> /// 将Word文档转化为图片 /// </summary> /// <param name=&q ...
- DB2 Rename SQL0108N错误
今天DB2 Rename的时候遇到了“SQL0108N ‘表名’名称的限定符数是错误的. 语句如下: db2 rename tableA to tableB 异常: SQL0108N The name ...
- WAP用户评论简单实现瀑布流加载
wap端经常会遇到产品或者评论的加载,但是分页的体验不是很好,所以选择通过js实现瀑布流加载方式. 第一步:需要动态加载的主要内容,这里需要动态加载的是li标签的内容 <ul class=&qu ...
- OpenStack基础知识
什么是云计算 地址规划 主机名 IP OpenStack01 172.30.2.135 有了云主机可以灵活扩展 OpenStack分为agent 和server端 ...
- Scrapy学习篇(一)之框架
概览 在具体的学习scrapy之前,我们先对scrapy的架构做一个简单的了解,之后所有的内容都是基于此架构实现的,在初学阶段只需要简单的了解即可,之后的学习中,你会对此架构有更深的理解.下面是scr ...
- DevExpress GridView删除行
int[] rows = gridView1.GetSelectedRows(); ) { if (DialogHelper.YesNo(this, "确认删除该记录?", &qu ...
- ARCGIS 出图显示not map metafile into memory.Not enough memory
有许多的原因,比如系统有问题,磁盘空间不够,或虚拟内存设置不对等.再有就是输出地图时分辨率的设置是否太大等. not enough memory 这个问题是ESRI的一个所谓的“臭名昭著 ...
- MySQL5.7修改默认密码、随机密码
mysql5.7以后默认生成随机密码,修改root用户密码 1.修改配置参数Linux: /etc/my.cnf Windows: C:\ProgramData\MySQL\MySQL Server ...
- linux 安装scala
1. 下载scala 到scala官网下载scala https://www.scala-lang.org/download/,目前最新版本是2.12.8 wget https://downloads ...