0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是分散加载文件?何时进行分散加载

工程师邓生 来源:wenzi嵌入式软件 作者:wenzid 2022-09-14 10:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

什么是分散加载文件

分散加载文件(scatter file)是一个文本文件,它的作用是可以用于描述 ARM 链接器生成映像文件所需要的信息。

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

何时进行分散加载

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

堆栈以及堆的初始化

定位中断向量表

调用 Reset Handler

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

8195e6be-3371-11ed-ba43-dac502259ad0.png

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

分散加载的原理

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

Code: 为程序代码部分

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

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

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

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

82163daa-3371-11ed-ba43-dac502259ad0.png

映像文件的组成

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

输入段:输入段包含代码、初始化数据,或描述未初始化的或在映像执行之前必须设定为 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,下面就是这个加载过程的示意图。

823334b4-3371-11ed-ba43-dac502259ad0.png

装载域和运行域示意图

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

分散加载的语法

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

825a0b70-3371-11ed-ba43-dac502259ad0.png

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

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

RAM基址:0x10000000,大小32KB

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

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

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




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19111

    浏览量

    403383
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9586

    浏览量

    393510
  • ROM
    ROM
    +关注

    关注

    4

    文章

    579

    浏览量

    89364
  • Cortex-M4
    +关注

    关注

    6

    文章

    100

    浏览量

    48542
  • 上电复位
    +关注

    关注

    1

    文章

    44

    浏览量

    16212

原文标题:keil分散加载文件浅析

文章出处:【微信号:wenzi嵌入式软件,微信公众号:wenzi嵌入式软件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EB tresos 加载失败的原因?怎么解决?

    我按照AN13750文档为 s32g3 构建 ipcf 包。在 EB tresos 中。我已经复制了 RTD eclypse 插件,导入了集成参考示例并加载了 ecuc。但仍然没有文件出现在 ECUC 下。
    发表于 04-13 07:51

    dtb 是如何在 uboot 中加载的?

    嗨,我正在使用 imx93,想知道 dtb 是如何在 uboot 中加载的,它是否是适合映像的一部分。最终需要了解 u-boot 中源代码中的位置和哪些文件是可恢复的。
    发表于 04-09 07:36

    在SPI NOR闪存中加载文件的偏移地址是多少?

    我们在 QorIQ SDKv2.0 中加载了使用自定义 RCW 字修改 RCW 字生成的u-boot-with-spl-pbl.bin,错误为“无法重置目标(T2080 内核无响应)”并且没有 UART 控制台消息 在SPI NOR闪存中加载文件的偏移地址是多少?
    发表于 04-08 06:38

    ELF-RV112B RKNN模型加载与运行时初始化

    ELF-RV112B RKNN模型加载与运行时初始化
    的头像 发表于 04-03 16:08 151次阅读
    ELF-RV112B RKNN模型<b class='flag-5'>加载</b>与运行时初始化

    恢复引导加载程序错误怎么解决?

    的问题。 因此,当连接到调试引脚并按住启动时,初始加载器会提供一小部分命令列表。load 命令应该为 XMODEM 连接打开以接收二进制数据并将其加载到给定地址。在恢复指令中,这用于将恢复加载
    发表于 03-26 07:18

    安科瑞虚拟电厂:分散资源的电力市场变现利器

    您是否还在为分布式能源分散、无市场准入资格而发愁?是否因能源管理难、能效低而困扰?是否担忧分布式能源波动给电网稳定带来的风险?
    的头像 发表于 02-24 17:50 1024次阅读
    安科瑞虚拟电厂:<b class='flag-5'>分散</b>资源的电力市场变现利器

    EPLAN分散式端子的画法和作用

    Eplan的分散式端子是指一个端子被画了N次,但是还是同一个端子;Eplan的机制是一个端子画一次之后第二个端子名称肯定是不一样的。
    的头像 发表于 01-21 15:50 953次阅读
    EPLAN<b class='flag-5'>分散</b>式端子的画法和作用

    图扑软件 3D 场景预加载应用实现

    加载是在进入正式场景之前提前加载所需模型、材质、图片等资源的技术手段,其核心价值在于消除资源加载等待,确保场景首次渲染即可完整呈现,从而提供无缝、流畅的用户体验。在复杂的 Web 3D 可视化
    的头像 发表于 12-01 16:04 940次阅读
    图扑软件 3D 场景预<b class='flag-5'>加载</b>应用实现

    Linux内核模块的加载机制

    内核模块是什么? 内核模块是动态加载到内核中的代码,可以在不重启系统的情况下扩展功能,比如设备驱动或者文件系统支持。这样用户不需要把所有功能都编译进内核,节省了资源,提高了灵活性。 模块的文件
    发表于 11-25 06:59

    国网河南地区用的分布式\分散式\集中式DTU

    国网河南地区配网自动化终端分布式、分散式、集中式DTU简单介绍:国网标准分散DTU由间隔单元和公共单元组成;分布式DTU由保护测控单元和综合通讯管理单元组成;集中式DTU有2017版和2021版,完全符合国家电网标准要求。
    的头像 发表于 11-13 15:08 1757次阅读
    国网河南地区用的分布式\<b class='flag-5'>分散</b>式\集中式DTU

    CherryUSB怎样实现U盘动态加载

    USB线时,再动态地卸载U盘并挂载文件系统。自己偿试在CherryUSB的事件回调usbd_event_handler中完成以上操作,但没成功,相关代码执行不到。是CherryUSB不支持动态加载
    发表于 10-14 07:31

    visionboardsdk中vision board blink led中的文件无法加载怎么解决?

    看的visionboardB站的入门教程 发现有些文件加载不了 但这个文件的确存在而且目录正确
    发表于 09-22 08:23

    Perforce JRebel 简介:即时加载代码变更,加速Java应用开发

    Perforce JRebel 专为Java开发提速而生!支持跳过构建与重新部署,实时加载代码变更,支持100+框架,无缝集成主流IDE与应用服务器。
    的头像 发表于 08-14 14:35 968次阅读
    Perforce JRebel 简介:即时<b class='flag-5'>加载</b>代码变更,加速Java应用开发

    HarmonyOS5云服务技术分享--云函数预加载文章整理

    名,类型选 ​​Cloud Function​​(预加载暂不支持云对象)。 ​​关键文件解析​​: ​​function-config.json​​:自动生成,别手改!这里定义了函数入口和触发器(默认
    发表于 05-22 20:33

    内藏式触控高分子分散液晶结构的光学复合结构及液晶线路激光修复

    一、引言 随着触控显示技术的发展,内藏式触控高分子分散液晶结构的光学复合结构凭借其独特优势,在智能终端等领域得到广泛应用。然而,在生产与使用过程中,液晶线路易出现故障,研究其修复技术对提升产品
    的头像 发表于 04-30 14:44 1338次阅读
    内藏式触控高分子<b class='flag-5'>分散</b>液晶结构的光学复合结构及液晶线路激光修复