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. 蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)

    关键词:蓝牙核心技术协议  irDA BNEP  AVDTP AVCTP 作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢! )欢迎指正错误,共同学习.共同进步!! 下载链接:Bl ...

  2. webAPP踩坑记录

    最近公司突然给我们下了一个任务  一个星期要做出一个系统网站 外加手机app   2个同事负责 web开发  我负责手机app 的开发 今天终于初级版本做完了,记录一下手机app踩过的坑与优化之路 用 ...

  3. java泛型学习(一)

    泛型也叫做参数化类型,顾名思义的去理解,就是把类型作为一个参数.类比方法的传参,我们举个例子. class A{ public void getX(int x){ System.out.println ...

  4. fatal: Authentication failed for “someurl”

    一.前言 我们在公司做项目,很多时候会遇到这个问题:Git failed with a fatal error. Authentication failed for ‘ http// xxx..... ...

  5. Mac OS 终端利器 iTerm2

    之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...

  6. 教程:安装禅道zentao项目管理软件github上的开发版

    该文章转自:吕滔博客 直接从github拉下来的禅道的源码,是跑不起来的.除非你按我的教程来做...哈哈哈(不要脸)~~~~ 禅道官网提供的版本包是带了有安装文件,并有打包合成一些css.js文件的. ...

  7. 【java设计模式】【行为模式Behavioral Pattern】模板方法模式Template Method Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { AbstractClass ...

  8. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  9. Hibernate框架HQL语句

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  10. ArcGIS 网络分析[2] 在ArcMap中使用网络数据集进行五大网络分析[最短路径/服务区/最近设施点/OD成本矩阵/车辆分配]

    上一章花了大篇幅介绍网络数据集的创建,也简单说了下点线的连通性问题. 那么可以试试刀锋不锋利啦! 网络分析呢,ArcGIS提供了5个基本分析类型: 最短路径求解 服务区(服务覆盖范围) 事故突发地的最 ...