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,如需转载请自行联系原作者
目录
相关文章
|
Linux C语言
RISC-V Linux汇编启动过程分析
RISC-V Linux汇编启动过程分析
|
安全 Java C语言
JUC
简介:本文详解Java并发编程核心机制,涵盖CAS原理及其在AtomicInteger等类中的应用,探讨ABA问题、自旋开销及多变量原子操作限制,并介绍Unsafe类与AQS同步框架,帮助开发者深入理解无锁与阻塞同步实现原理。
659 0
|
机器学习/深度学习 自然语言处理 PyTorch
Transformers入门指南:从零开始理解Transformer模型
【10月更文挑战第29天】作为一名机器学习爱好者,我深知在自然语言处理(NLP)领域,Transformer模型的重要性。自从2017年Google的研究团队提出Transformer以来,它迅速成为NLP领域的主流模型,广泛应用于机器翻译、文本生成、情感分析等多个任务。本文旨在为初学者提供一个全面的Transformers入门指南,介绍Transformer模型的基本概念、结构组成及其相对于传统RNN和CNN模型的优势。
14256 1
|
设计模式 JavaScript 前端开发
addEventlistener和正常的onclick=()=> 的区别
【10月更文挑战第29天】`addEventListener` 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 `onclick` 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 `onclick` 属性,以提高代码的质量和可维护性。
|
Linux 索引
RISC-V SiFive U54内核——CLINT中断控制器
RISC-V SiFive U54内核——CLINT中断控制器
|
NoSQL IDE 物联网
RISC-V生态全景解析(八):平头哥玄铁CPU调试系统介绍
编辑语: 芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。
4031 0
RISC-V生态全景解析(八):平头哥玄铁CPU调试系统介绍
|
12天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
12天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
18天前
|
网络协议 Linux iOS开发
【2026实测】Wireshark下载+安装+汉化+使用教程(图文版,巨详细)
Wireshark 是一款免费开源的网络协议分析工具,可实时捕获、解析并可视化数据包,助你诊断网络故障、分析通信协议(如HTTP、DNS、TCP等)。支持Windows/macOS/Linux,含中文界面,新手入门便捷。(239字)
|
11天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1361 8
Qoder 上线 Sonus 模型,Computer Use 能力全面增强