Cortex-M3启动深度解析

Cortex-Mx启动,备忘,以免将来忘记。
中断向量表不用说,从重置中断开始吧

 

LDR     R0, =SystemInit
BLX     R0
LDR     R0, =__main
BX      R0

 

这里一共就执行了两个函数,SystemInit和__main。

我们一般在SystemInit里面配置系统时钟,这里跳过。

__main是我们今天的重点。

 

复制代码
                 __main:
0x080000C0 4804      LDR      r0,[pc,#16]  ; @0x080000D4
0x080000C2 4685      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 4800      LDR      r0,[pc,#0]  ; @0x080000D0
0x080000CE 4700      BX       r0        #进入C++的main函数
复制代码

 

 

 

分散加载这里将会初始化我们的全局静态变量

 

复制代码
.text:00000000 __scatterload_rt2
.text:00000000                 LDR     R4, =Region$Table$Base
.text:00000002                 MOVS    R5, #1
.text:00000004                 LDR     R6, =Region$Table$Limit
.text:00000006                 B       loc_14
.text:00000008 ; ---------------------------------------------------------------------------
.text:00000008
.text:00000008 loc_8                                   ; CODE XREF: __scatterload_rt2+16j
.text:00000008                 LDR     R3, [R4,#0xC]
.text:0000000A                 LDMIA   R4!, {R0-R2}
.text:0000000C                 ORRS    R3, R5
.text:0000000E                 SUBS    R4, #0xC
.text:00000010                 BLX     R3
.text:00000012                 ADDS    R4, #0x10
.text:00000014
.text:00000014 loc_14                                  ; CODE XREF: __scatterload_rt2+6j
.text:00000014                 CMP     R4, R6
.text:00000016                 BCC     loc_8
.text:00000018                 BL      __main_after_scatterload
复制代码

 

可能汇编看起来不是很直观,我们配合看F5得到的反编译C代码

复制代码
void _scatterload_rt2()
{
  _DWORD *i; // r4@1

  for ( i = &Region__Table__Base; (_UNKNOWN *)i < &Region__Table__Limit; i += 4 )
    ((void (__fastcall *)(_DWORD, _DWORD, _DWORD))(i[3] | 1))(*i, i[1], i[2]);
  _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系统初始化的时候再重新设置堆空间

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
分类: 物联网

本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/cortex_m3_boot.html,如需转载请自行联系原作者
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/385205

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。