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 ...
随机推荐
- Ubuntu 报错 sudo: unable to resolve host
Ubuntu 在每次执行命令的时候,会报如下错误: $ sudo sudo: unable to resolve host iZ2zecsdy8flu603bmdg1bZ iZ2zecsdy8flu6 ...
- JavaSe: String的编译期优化
Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时, ...
- IntelliJ IDEA创建java项目
IntelliJ IDEA创建java项目 进入到IntelliJ IDEA启动界面,点击Create New Project 2.这样就进入到了创建项目页面,这里可以创建好多项目,这里我们以java ...
- Intellij 解除(去除)SVN关联
方法一:通过Intellj 来处理 1. 安装插件 打开Intellij的setting(ctrl+alt+s),选择plugins,在右边搜索框输入"SVN",搜索.选择&quo ...
- 基于apache httpclient 调用Face++ API
简要: 本文简要介绍使用Apache HttpClient工具调用旷世科技的Face API. 前期准备: 依赖包maven地址: <!-- https://mvnrepository.com/ ...
- Influxdb1.2.2安装
一.文件准备 1.1 文件名称 influxdb-1.2.2.x86_64.rpm 1.2 下载地址 https://portal.influxdata.com/downloads [注意.注意.注意 ...
- case
case $变量 in "值1") 执行语句; ;; "值2") 执行语句; ;; ... *) 默认执行语句 ;; esac #!/bin/bash read ...
- 【HTML5】增强的表单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【java】io流之字节流转为字符流:java.io.OutputStreamWriter和java.io.InputStreamReader
package 文件操作; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...
- JavaWeb 例子 JDBC+JSP登陆注册留言板
注册页面: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...