当前位置:首页 > 公众号精选 > wenzi嵌入式软件
[导读]分散加载文件(scatter file)是一个文本文件,它的作用是可以用于描述 ARM 链接器生成映像文件所需要的信息。

什么是分散加载文件

分散加载文件(scatter file)是一个文本文件,它的作用是可以用于描述 ARM 链接器生成映像文件所需要的信息。
如果不使用 scatter file 文件来指定,那么 ARM 链接器会按照默认的方式来生成映像文件,但是对于某些应用场景来说,我们希望能够将一些数据放在指定的位置,这个时候,分散加载文件就发挥其作用了。

何时进行分散加载

在之前的一篇文章 MCU 是如何从上电复位运行到 main 函数的?中详细叙述了MCU运行到 main 函数之前所做的操作。简而言之,主要做了如下三个工作:

  • 堆栈以及堆的初始化

  • 定位中断向量表

  • 调用 Reset Handler

下图列出了ARM Cortex M4系列芯片的一个启动流程,厂商不一样,会存在细微的差别。

在这里插入图片描述


由上述启动流程可以看到,分散加载操作是在 __main() 函数内部完成的,紧接着,就运行 C 语言运行环境初始化 & C Library 的初始化。

分散加载的原理

在理解分散加载的原理之前,需要明白以下几个概念:

  • Code: 为程序代码部分

  • RO-Data: 表示程序定义的常量及const型数据

  • RW-Data:表示已经初始化的静态变量,变量有初值

  • ZI-Data: 表示未初始化的静态变量,变量无初值

除此之外,因为分散加载的机制是将不同代码放在不同的存储空间,因此还需要了解代码的映像文件的基本概念。ARM 映像文件其实就是源文件经编译器生成的目标文件 .obj(object file)和相应的 C/C++ 运行时库( Runtime Library )经过连接器的处理后,生成的 axf 格式的映像文件,它可以直接烧录到目标设备的 ROM 中直接运行或加载后运行。映像文件的组成如下所示:

映像文件的组成


由上图可以知道,映像文件由域(区)、输出段(节)和输入段(节)的层次结构组成:

  • 输入段:输入段包含代码、初始化数据,或描述未初始化的或在映像执行之前必须设定为 0 的内存片段。这些特性通过 RO 、 RW 和 ZI 这样的属性来表示。

  • 输出段:一个输出段由若干个具有相同 RO 、 RW 或 ZI 属性的相邻输入段组成。输出段的属性与组成它的输入段的属性相同 。

  • 域:一个域由一个、两个或者三个相邻的输出段组成。区中的输出段根据其属性排序。首先是 RO 输出段,然后是 RW 输出段,最后是 ZI 输出段。域通常映射到物理内存设备,如 ROM 、 RAM 或外围设备。

ARM 映像文件各组成部分在存储系统中的地址有两种:

  • 装载域

  • 运行域

在一个简单的嵌入式计算机系统中,存储器一般分为ROM和RAM。链接器生成的映像被分为“Read-Only”段和“Read-Write”段(包含已初始化数据和未初始化数据)。通常来说,在程序下载的时候,他们会被下载到ROM上,而在程序开始执行的时候,Read-Write段会从ROM被Copy到RAM,下面就是这个加载过程的示意图。

装载域和运行域示意图


以上只是一个简单的例子,但是在比较复杂的嵌入式系统中,其存储器往往还包括ROM,SRAM,DRAM,FLASH等等,这个时候就需要分散加载文件了。

分散加载的语法

分散加载文件主要由一个加载时域(区)和多个运行时域(区)组成,其大致结构如下图所示:

在这里插入图片描述


本次先介绍一种简单的情况,一个Cortex M3系列的微控制器有Flash和RAM资源如下所示:

  • Flash基址:0x00000000,大小256KB;

  • RAM基址:0x10000000,大小32KB

那么分散加载文件可以这么写:

LR_IROM1 0x00000000 0x00040000 ;定义一个加载域,域基址为0x00000000,大小为0x00040000 {                                     ;对应着实际的 Flash 的大小
    ER_IROM1 0x00000000 0x00040000 ;定义一个运行域,第一个运行域必须和加载域起始地址相同
    {
        *.o(RESER,+First)             ;将RESET最先加载到本域的起始地址,即RESET的起始地址为0 .ANY(+RO)                     ;加载所有匹配目标文件的只读属性数据,包含:Code,RW-Data
    }

    RW_IRAM1 0x10000000 0x00008000 ;定义一个运行时域,域基址为0x10000000,域大小为 0x00008000 {
        *(+RW+ZI)                   ;加载所有匹配目标文件的RW-Data,ZI-Data
    }
}

总结

上述就是关于分散加载的叙述,所举的例子比较简单,在后续的文章中,将针对于其较为复杂的应用进行阐述,欢迎关注wenzi嵌入式软件公众号~


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月19日,华为全联接大会2022在泰国曼谷拉开帷幕,华为在大会上分享了推进行业数字化发展的核心举措,并面向全球市场发布超过15余项创新云服务。在全联接大会上,华为轮值董事长胡厚崑表示,目前华为正在积极与行业伙伴合作,一...

关键字: 华为 10Gbps速率 5G 5.5G

高速电路应该怎么学习呢?直接买本信号完整性的书籍看吗?还是利用网咯资源直接上手呢?我想结果都不会太好。

关键字: 高速电路 射频电路

研发产品难吗?对于刚刚接触射频硬件设计的我来说非常难,设计和调试、维修不同,调试是在老带新的基础上,按照图纸甚至图纸都不要就可以按照SOP流程得到性能高的产品;维修的话,看懂原理图是必须的,但是你并不需要知道具体的设计参...

关键字: 射频工程师 设计 调试

在调试了收发信机半年时间后,对发射机和接收机的组成总算有了大概的了解,不过也仅仅限于了解,碰到退货维修件还是有很多难点搞不清楚,更别提做射频设计了。不过也有好的方面,公司的几个优秀的同事都是我们学校出来的,有的在大一的时...

关键字: 收发信机 射频工程师

前不久,华为创始人任正非的讲话提到,“活下来,把寒气传递给每个人”,变成热点话题。随即而来的,便是隔日A股市场的暴跌,仿佛凛冬将至。然而,在暴跌之后,许多上市公司也纷纷公布了半年报,其中也不乏有着亮眼业绩的公司。通过统计...

关键字: IoT 芯片

近日,Silicon Labs “2022年Works With开发者大会” 大中华区媒体交流活动如期举办。活动内容除了Silicon Labs的新产品宣传,还有业内人士分享对物联网行业及相关市场的思考,同时也针对到场媒...

关键字: 芯片 半导体企业 IoT应用

近日,随着万众瞩目的苹果秋季发布会告一段落,几款新产品也进入大众视野。这一届新产品虽在软件上令人耳目一新,但硬件上却无太大更新。不过在硬件的布置方面,苹果仍有值得一提的动作,比如被嵌入到AirPods Pro耳机盒中的U...

关键字: 苹果 硬件 U1芯片

物联网的概念已经火热了超过10年的时间,在这10多年的时间里,物联网概念呈星火燎原之势,因为物联网涵盖内容多,设计到的技术、产品、方案乃至应用非常多,所以,越来越多的企业认可了物联网这个概念,也将自己的业务范围定位为物联...

关键字: 物联网

考虑到现在讨厌男生打游戏的女生越来越多,作为暖男的小编今天就教各个女生如何在一开始就分辨出约会对象爱不爱打游戏:你可以观察他家的电脑,如果连着网线,证明这个男生很有可能是经常打游戏的人。感谢的话不用多说,接下来我就来解释...

关键字: Wi-Fi 网线传输

近日,米家新品户外电源1000 pro发售。据悉,该产品可支持大部分户外电器及常用设备,搭配丰富的充放电接口,可支持13台设备同时充电。值得一提的是,米家同时发布了太阳能电板,二者配合可实现边用边充。

关键字: 小米 便携储能

编辑精选

技术子站

关闭