Cortex-M3启动深度解析
Cortex-Mx启动,备忘,以免将来忘记。
中断向量表不用说,从重置中断开始吧
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
这里一共就执行了两个函数,SystemInit和__main。
我们一般在SystemInit里面配置系统时钟,这里跳过。
__main是我们今天的重点。
__main:
0x080000C0 LDR r0,[pc,#] ; @0x080000D4
0x080000C2 MOV sp,r0 #设置栈顶
_main_scatterload:
0x080000C4 F000F956 BL.W __scatterload (0x08000374) #分散加载(拷贝初始值、清零变量)
__main_after_scatterload:
0x080000C8 F000F8D4 BL.W __cpp_initialize__aeabi_ (0x08000274) #C++初始化(全局对象构造函数执行)
_main_cpp_init:
0x080000CC LDR r0,[pc,#] ; @0x080000D0
0x080000CE BX r0 #进入C++的main函数
分散加载这里将会初始化我们的全局静态变量
.text: __scatterload_rt2
.text: LDR R4, =Region$Table$Base
.text: MOVS R5, #
.text: LDR R6, =Region$Table$Limit
.text: B loc_14
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_8 ; CODE XREF: __scatterload_rt2+16j
.text: LDR R3, [R4,#0xC]
.text:0000000A LDMIA R4!, {R0-R2}
.text:0000000C ORRS R3, R5
.text:0000000E SUBS R4, #0xC
.text: BLX R3
.text: ADDS R4, #0x10
.text:
.text: loc_14 ; CODE XREF: __scatterload_rt2+6j
.text: CMP R4, R6
.text: BCC loc_8
.text: BL __main_after_scatterload
可能汇编看起来不是很直观,我们配合看F5得到的反编译C代码
void _scatterload_rt2()
{
_DWORD *i; // r4@1 for ( i = &Region__Table__Base; (_UNKNOWN *)i < &Region__Table__Limit; i += )
((void (__fastcall *)(_DWORD, _DWORD, _DWORD))(i[] | ))(*i, i[], i[]);
_main_after_scatterload();
JUMPOUT(&Region__Table__Base);
}
从上面看出,有一张区域表,每4个int作为一段,每一段前三个为参数,第四个为函数指针。
经过调试得知:
第一个函数是__scatterload_copy,从某个Flash地址把数据拷贝给RAM里面的变量,也就是带有初始值的全局变量;
第二个函数是__scatterload_zeroinit,顾名思义,就是全局变量清零,只要没有初始值的全局变量,都清零,堆空间和栈空间一块清。
而在汇编文件里面我们有AREA HEAP, NOINIT, READWRITE, ALIGN=3。显然其中的NOINIT并没有生效
ER_IROM1:0800D704 Region$Table$Base DCD 0x800D72C ; #要拷贝的初始值来源,紧跟在固件源代码后面
DATA XREF: ER_IROM1:__scatterload_rt2o
ER_IROM1:0800D704 ; ER_IROM1:off_8000390o
ER_IROM1:0800D708 DCD 0x20000000 #要复制初始值的起始地址
ER_IROM1:0800D70C DCD 0xCC #带有初始值的区域大小
ER_IROM1:0800D710 DCD __scatterload_copy
ER_IROM1:0800D714 DCD 0x800D7F8
ER_IROM1:0800D718 DCD 0x200000CC #要清零的变量起始地址
ER_IROM1:0800D71C DCD 0x132C #要清零的变量大小
ER_IROM1:0800D720 DCD __scatterload_zeroinit
ER_IROM1:0800D724 EXPORT SHT$INIT_ARRAY$Base
因此,针对__scatterload_zeroinit而言,为了加快启动速度,建议堆空间设得尽量小,然后在SmartOS系统初始化的时候再重新设置堆空间
Cortex-M3启动深度解析的更多相关文章
- ARM Cortex M3(V7-M架构)硬件启动程序 二
解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...
- ARM Cortex M3(V7-M架构)硬件启动程序 一
Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...
- Kafka深度解析
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Unity加载模块深度解析(Shader)
作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...
- SpringMVC 源码深度解析<context:component-scan>(扫描和注冊的注解Bean)
我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...
- String深度解析
文章出处:http://my.oschina.net/xiaohui249/blog/170013 一.引题 String类型是比较特殊的一种类型,同时也是面试经常被问到的一个知识点,本文结合java ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析
在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...
随机推荐
- jquery查找元素
一:查找元素 * 所有元素 element 该名称的所有元素(p,input) #id 拥有指定id属性的元素 .class 拥有所有指定class属性的元素 selector1,selector2 ...
- 【JAVA零基础入门系列】Day7 Java输入与输出
[JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day ...
- vue路由
vue-router 现在的应用都流行SPA应用(single page application) 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候受网络 ...
- SpringMVC+ZTree实现树形菜单权限配置
计划在开源项目里加入权限配置的功能,打算加入zTree实现树形结构. Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎sta ...
- 关于close和shutdown
我们知道TCP是全双工的,可以在接收数据的同时发送数据.假设有主机A在和主机B通信,可以认为是在两者之间存在两个管道.就像这样:A ---------> BA <--------- B 1 ...
- ASP.NET.Core中使用AutoMapper
首先需要在NuGet中引用AutoMapper的类库 install-package AutoMapper install-package AutoMapper.Extensions.Micros ...
- dubbo+zookeeper+jsp+springmvc+spring+mybatis+mysql+maven完整示例
项目分为三部分,这里分为三个maven项目(基于web,所以最后一个为maven创建的web项目) 1.接口定义以及实体类定义(api+pojo) --- maven创建java项目,打包成jar 2 ...
- Django ModelForm修改默认的控件属性
Django 中利用ModelForm 可以快速地利用数据库对应的Model 子类来自动创建对应表单. 例如: from django.db import models from django.for ...
- 通过C#来开启、关闭、重启Windows服务
通过C#开启服务需要这个C#程序有相应权限,比如服务的账户是Local System的就必须以管理员权限运行C#程序才能开启或关闭. 这里只写重启的方式(就是先关闭,后开启): // Security ...
- 强推一款开源集成开发环境——Geany
本人是一个标标准准的程序员,集成开发环境在电脑上大概看一下有:Code Blocks(C/C++),VS(C#,C/C++),eclipse(Java),Hbuild和web storm(前端),py ...