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启动深度解析的更多相关文章

  1. ARM Cortex M3(V7-M架构)硬件启动程序 二

    解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...

  2. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  3. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  4. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

  5. Unity加载模块深度解析(Shader)

    作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...

  6. SpringMVC 源码深度解析&lt;context:component-scan&gt;(扫描和注冊的注解Bean)

    我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...

  7. String深度解析

    文章出处:http://my.oschina.net/xiaohui249/blog/170013 一.引题 String类型是比较特殊的一种类型,同时也是面试经常被问到的一个知识点,本文结合java ...

  8. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  9. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

随机推荐

  1. 基于ASP.MVC票据FormsAuthenticationTicket身份认证

    做一个最基础的业务需求用户登录,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端.服务端上的授权设置就可以根据不同目录对不同用户的访 ...

  2. 二.java下使用RabbitMQ实现hello world

    上一篇文章介绍了windows环境下的安装和配置rabbitMQ,具体戳这边,一.windows环境下rabbit的的安装和配置. 现在我们可以着手编写hello world程序了,一窥RabbitM ...

  3. java注解细节

    现在很多框架都使用注解了,典型的像Spring里面就可以看到大量的注解,比如@Service,@Controller这一类的都是注解.注解Annotation是java一项很重要的功能.下面就来整理一 ...

  4. ERR Unsupported CONFIG parameter: notify-keyspace-events; nested exception is redis.clients.jedis.exceptions.JedisDataException

    异常信息 时间:2017-04-05 15:53:57,361 - 级别:[ WARN] - 消息: [other] The web application [ROOT] appears to hav ...

  5. Xcode中StoryBoard Reference 新特性的使用

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)

    我们经常使用github上的开源项目,使用步骤也很简单 比如: compile 'acffo.xqx.xwaveviewlib:maven:1.0.0' 这里就学习一下如何将自己的类库做出这种可以供他 ...

  7. DotNetCore跨平台~Moq框架实现模拟测试

    回到目录 当我们进行软件开发时,一般会写单元测试,而对于业务情景来说,一般是测试它的业务逻辑准确性,对于你的测试数据是否来自数据库还是文件,是否为真实还是模拟,并不是很关心!我关心的就是我的业务逻辑是 ...

  8. C# 委托高级应用----线程——创建无阻塞的异步调用(一)

    前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助.原英文文献可以在codeproject中搜索到. ...

  9. [Maven] Missing artifact

    今天从朋友那拷过来一个maven工程,eclipse中maven配置好了,maven仓库也配置完毕,但是一直报Missing artifact,然后开网执行maven update,下载完jar后,还 ...

  10. splay小结—植树结

    我要把高级数据结构当爸爸了... ...弱到跪烂了. splay,二叉搜索树的一种,具有稳定变形功能. 二叉搜索树:对于一个节点,都只有不超过2个孩子.其左子树内的点的权值都比这个点小,右子树的点的权 ...