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

    文章

    18618

    浏览量

    387345
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388795
  • ROM
    ROM
    +关注

    关注

    4

    文章

    578

    浏览量

    88558
  • Cortex-M4
    +关注

    关注

    6

    文章

    100

    浏览量

    47814
  • 上电复位
    +关注

    关注

    1

    文章

    43

    浏览量

    16143

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    Linux内核模块的加载机制

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

    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 493次阅读
    Perforce JRebel 简介:即时<b class='flag-5'>加载</b>代码变更,加速Java应用开发

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

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

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

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

    炭纸及双极板电阻仪力值加载系统的工作原理与关键技术​

    为机械能,带动丝杠进行旋转运动。丝杠与螺母构成螺旋传动副,螺母在丝杠的带动下产生直线位移,进而将力传递到与螺母相连的加载压头,使压头对样品施加压力。​ 例如,当需要对炭纸进行垂直电阻率测试时,
    的头像 发表于 03-25 09:17 501次阅读
    炭纸及双极板电阻仪力值<b class='flag-5'>加载</b>系统的工作原理与关键技术​

    H750 + TouchGFX分散加载KEIL5报错Error: L6216E的原因?怎么解决?

    分散加载选中这些文件夹就会报错 报错信息:.STM32H750XBH6_GFX_RSTM32H750XBH6_GFX_R.axf: Error: L6216E: Cannot use base/limit symbols fo
    发表于 03-14 08:12

    将指定文件下的函数加载到指定ram问题

    问题:mcuxpresso环境,xip模式下我需要使用flexspi将norflash的一部分作为文件系统,将flex以及fatfs相关函数全部加载到ram,发现rodata仍然在flash地址
    发表于 03-12 17:02

    DLPC350用DLP进行固件制作时,加载之前旧的Bin文件后,软件就闪退了怎么解决?

    就是我用DLP进行固件制作时,加载之前旧的Bin文件后,软件就闪退了,能不能尽快给我解答一下呢?
    发表于 02-24 07:51

    【技术分享】迅为RK3568开发板使用TFTP加载内核设备树

    【技术分享】迅为RK3568开发板使用TFTP加载内核设备树
    的头像 发表于 02-21 14:04 1124次阅读
    【技术分享】迅为RK3568开发板使用TFTP<b class='flag-5'>加载</b>内核设备树

    EE-323:实现动态加载的软件模块

    电子发烧友网站提供《EE-323:实现动态加载的软件模块.pdf》资料免费下载
    发表于 01-06 15:34 0次下载
    EE-323:实现动态<b class='flag-5'>加载</b>的软件模块

    EE-240: ADSP-BF533 Blackfin加载过程

    电子发烧友网站提供《EE-240: ADSP-BF533 Blackfin加载过程.pdf》资料免费下载
    发表于 01-05 10:00 0次下载
    EE-240: ADSP-BF533 Blackfin<b class='flag-5'>加载</b>过程

    Stellaris引导加载程序用户指南

    电子发烧友网站提供《Stellaris引导加载程序用户指南.pdf》资料免费下载
    发表于 12-23 16:24 0次下载
    Stellaris引导<b class='flag-5'>加载</b>程序用户指南