当前位置: 首页 > article >正文

分散加载详解与应用

分散加载Scatter Loading是一种由链接器Linker提供的、用于精确控制程序各个段如代码、数据在目标存储器如 Flash、RAM中加载地址和执行地址的机制。其核心在于将单一的、线性的加载视图Load View映射到可能不连续且具有不同特性的物理存储空间形成执行视图Execution View。它通过一个称为分散加载描述文件Scatter Loading Description File通常为.sct文件的文本脚本指导链接器完成这一复杂的内存布局。分散加载的核心原理加载域与执行域分散加载的运作基于两个核心概念加载域Load Region和执行域Execution Region。概念描述类比加载域程序映像Image最初被存储烧录的存储器区域。一个加载域对应一个物理存储块如 Flash具有起始地址和大小。仓库的“货架”货物代码/数据初始存放的位置。执行域程序在运行时其代码或数据实际被访问执行或读写的存储器区域。一个加载域可以包含多个执行域它们可以位于相同或不同的物理地址。工厂的“生产线”或“工作台”货物被搬移至此以供使用。链接器的工作流程分为两步加载时将编译器生成的各个目标文件.o中的输入段Input Section如.text,.data合并并按照分散加载脚本的指示放置到指定的加载域地址生成最终的二进制映像文件如.axf,.bin。运行时启动时在main()函数执行前由启动代码Startup Code中的__main函数C库初始化例程负责将需要移动的数据如已初始化的全局变量.data段从其加载地址如 Flash拷贝到其执行地址如 RAM并将未初始化的静态变量区域.bss段在 RAM 中清零。对于代码段.text和只读数据段.rodata如果其加载地址和执行地址相同通常在 Flash 中原地执行XIP则无需移动。分散加载描述文件.sct语法详解以 ARM CompilerKeil MDK为例一个.sct文件的基本结构如下LR_IROM1 0x08000000 0x00010000 { ; 定义一个加载域 (Load Region) ER_IROM1 0x08000000 0x00010000 { ; 定义一个执行域 (Execution Region) *.o (RESET, First) ; 输入节描述将RESET段放在最前 *(InRoot$$Sections) ; 特殊的库段必须放在根域 .ANY (RO) ; 所有RO只读代码和常量内容 } RW_IRAM1 0x20000000 0x00005000 { ; 另一个执行域位于RAM .ANY (RW ZI) ; 所有RW已初始化变量和ZI零初始化变量内容 } }关键组成部分解析加载域定义LR_IROM1 0x08000000 0x00010000LR_IROM1加载域名可自定义。0x08000000加载域的起始地址STM32 Flash 起始地址。0x00010000加载域的最大长度64KB。执行域定义ER_IROM1 0x08000000 0x00010000嵌套在加载域内定义了代码/数据在运行时的位置。起始地址和长度属性与加载域可以不同。如果省略地址链接器会自动安排在加载域之后如果省略长度则使用加载域的剩余空间。输入节描述模块选择模式*.o (RESET, First)选择所有目标文件中的RESET段并使用First属性强制将其放置在该执行域的首位。这通常用于放置中断向量表。*(InRoot$$Sections)这是一个必须包含在根执行域地址固定的执行域的特殊符号集合包含了 C 库初始化等关键代码。.ANY (RO)选择所有未被前面模式匹配的模块中的只读RO段。RO是属性选择器代表.text代码和.rodata只读数据。RW和ZI分别代表已初始化的读写数据段和零初始化数据段它们通常需要被分配到 RAM 中的执行域。分散加载的主要应用场景与用法示例1. 配合 Bootloader 实现应用程序重定位这是最经典的应用。Bootloader 固定在 Flash 起始地址用户应用程序APP需要从后续地址开始存放。这需要修改 APP 工程的分散加载文件。APP 的分散加载文件 (app.sct) 示例/* 假设 Bootloader 占用 0x08000000 - 0x08003FFF (16KB) */ LR_IROM1 0x08004000 0x0000C000 { ; APP加载域从0x08004000开始长度48KB ER_IROM1 0x08004000 0x0000C000 { ; 执行域地址与加载域相同XIP *.o (RESET, First) *(InRoot$$Sections) .ANY (RO) } RW_IRAM1 0x20000000 0x00005000 { ; RAM域不变 .ANY (RW ZI) } }同时在 APP 的main()函数开始需要重设中断向量表偏移寄存器如 ARM Cortex-M 的SCB-VTOR为0x08004000确保中断能正确跳转到新的向量表。2. 将关键代码或数据加载到高速内存如 CCM RAM、TCM执行为了提升性能可以将对实时性要求极高的函数如中断服务程序、算法核心循环放到零等待周期的 SRAM如 STM32 的 CCM RAM中执行。实现步骤方法一通过分散加载文件指定LR_IROM1 0x08000000 0x00010000 { ER_IROM1 0x08000000 0x00010000 { .ANY (RO) ; 大部分代码放在Flash } ER_CCM 0x10000000 0x00001000 { ; CCM RAM执行域起始地址0x10000000 my_fast.o (RO) ; 将my_fast.c文件中的所有代码段放到CCM *(.FastSection) ; 或者将所有放在.FastSection段的内容放到CCM } RW_IRAM1 0x20000000 0x00005000 { .ANY (RW ZI) } }在 C 代码中需要使用__attribute__将特定函数或变量分配到自定义段。// 将函数放到名为 .FastSection 的段中 __attribute__((section(.FastSection))) void critical_isr(void) { // 关键中断处理代码 }方法二在代码中直接指定绝对地址不推荐灵活性差// 将变量定位到特定地址 uint32_t __attribute__((at(0x20001000))) high_speed_buffer[1024];3. 实现非连续存储器的利用当芯片具有多块不连续的物理内存时如两块独立的 SRAMSRAM1 和 SRAM2分散加载可以高效地管理它们。LR_IROM1 0x08000000 0x00100000 { ER_IROM1 0x08000000 0x00100000 { .ANY (RO) } RW_IRAM1 0x20000000 0x00010000 { ; SRAM1 .ANY (RW ZI) ; 默认分配到这里 } RW_IRAM2 0x20010000 0x00008000 { ; SRAM2 large_buffer.o (RW) ; 将某个模块的大缓冲区单独放到SRAM2 } }4. 将函数或变量固定在特定地址例如需要在两个独立的应用程序如 Bootloader 和 APP之间共享一段数据或者为某个特定的函数提供固定的入口地址以供调用。LR_IROM1 0x08000000 0x00100000 { ER_IROM1 0x08000000 { .ANY (RO) } ER_SHARED 0x0800FC00 FIXED 0x400 { ; FIXED属性固定该执行域的地址和大小 shared_data.o (RW) ; 共享数据模块 } RW_IRAM1 0x20000000 0x00010000 { .ANY (RW ZI) } }使用FIXED属性可以确保该执行域的地址不会被链接器优化或移动。在 C 代码中对应的变量或函数通过自定义段名被引导至此。在 Keil MDK 中的配置步骤打开Options for Target - Linker选项卡。取消勾选Use Memory Layout from Target Dialog。在Scatter File输入框中选择或输入自定义的.sct文件路径。重新编译工程链接器将依据此文件进行链接。总结与注意事项分散加载是进行复杂内存管理、性能优化和实现高级功能如 Bootloader、双系统的基石。其本质是通过脚本将程序的逻辑段与物理存储的地址和特性进行解耦和精确映射。在使用时必须清晰理解加载域与执行域的区别以及启动时代码和数据的搬移过程。对于简单的项目IDE 默认的链接脚本通常足够但当项目涉及多存储区域、性能关键代码、固件升级IAP或特定地址约束时掌握并编写分散加载文件就成为嵌入式开发者的必备技能。调试时可以通过生成的.map文件来验证各段的最终布局是否符合预期。参考来源ARM Cortex-M底层技术六分散加载的简单介绍分散加载的简单介绍STM32 分散加载ARM Cortex-M底层技术十三手把手教你写分散加载MDK 分散加载文件剖析(一)分散加载的实现

相关文章:

分散加载详解与应用

分散加载(Scatter Loading)是一种由链接器(Linker)提供的、用于精确控制程序各个段(如代码、数据)在目标存储器(如 Flash、RAM)中加载地址和执行地址的机制。其核心在于将单一的、线…...

Flutter 三方库 get\_it + injectable 的鸿蒙化适配指南:实现优雅的依赖注入

Flutter 三方库 get_it injectable 的鸿蒙化适配指南:实现优雅的依赖注入 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 大家好呀!🌸 今天要和大家分享一个超级实用的Flutter开发技巧——如何将 get_i…...

亚马逊品牌推广:破局只曝光不转化误区,解锁拿单新思路

亚马逊品牌推广:破局只曝光不转化误区,解锁拿单新思路 正文: 新品上线 6 个月仅投商品推广,核心词 CPC 一路走高,ACOS居高不下,冷启动慢、迟迟起不了量?不少亚马逊卖家都面临这样的困境&#xf…...

别再让RAG乱给答案了!手把手教你用Cohere Rerank给LangChain检索结果‘排座次’

用Cohere Rerank重构LangChain检索逻辑:从混沌到精准的实战指南 当你发现自己的RAG系统开始像醉酒的水手一样胡言乱语时,是时候给那些混乱的检索结果"排座次"了。作为一名长期与LangChain打交道的开发者,我经历过无数次检索结果相关…...

3分钟掌握电脑性能优化:开源工具UXTU终极指南

3分钟掌握电脑性能优化:开源工具UXTU终极指南 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 你是否曾经感觉自己的…...

UNIT-00模型在ComfyUI工作流中的插件开发与应用

UNIT-00模型在ComfyUI工作流中的插件开发与应用 1. 引言 如果你用过ComfyUI,肯定会被它那种节点拖拽、自由连接的工作流设计所吸引。它把AI图像生成的每一步都变成了可视化的模块,从加载模型到生成图片,整个过程清晰可控。但不知道你有没有…...

零门槛体验:VoxCPM-1.5-WEBUI三步部署教程,快速上手语音合成

零门槛体验:VoxCPM-1.5-WEBUI三步部署教程,快速上手语音合成 1. 为什么选择VoxCPM-1.5-WEBUI? 在当今内容创作爆炸的时代,语音合成技术正变得越来越重要。无论是制作短视频配音、有声读物,还是开发智能客服系统&…...

Windows安卓子系统(WSA)实用指南:3步快速部署与5大优化技巧

Windows安卓子系统(WSA)实用指南:3步快速部署与5大优化技巧 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 你是否想在Windows 11电脑上无缝运行…...

2026年MySQL安装教程(超详细)

MYSQL下载及配置,一遍成功引言第一部分:下载教程第二部分:安装与配置第三部分:验证引言 大家好,我是菜程序,今天聊聊mysql的下载及配置,后端开发一定离不开数据库的支持,所以我便整…...

Hermes Agent 工具-周红伟

工具是扩展智能体能力的函数。它们被组织成逻辑上的工具集,可以在每个平台上启用或禁用。Hermes Agent 附带了一个广泛的内置工具注册表,涵盖网页搜索、浏览器自动化、终端执行、文件编辑、记忆、委托、RL 训练、消息投递、Home Assistant 等。可用工具工…...

「鸿蒙智能体实战记录 13」智能体上架提交与审核通过实现

📘 鸿蒙智能体实战记录 13 智能体上架提交与审核通过实现一、本篇目标 完成以下内容: 新建隐私协议完成隐私协议服务配置完成内容合规设置补充审核安全提示词进入智能体上架提交页面填写上架说明上传效果截图附件完成最终提交与验证二、新建隐私协议 进入…...

聊聊C语言那些事儿之概览

十分感谢前来阅读的读者和有兴趣学习c语言的朋友们,萌小编会和大家一起学习c语言。我们的口号是:学好,玩好,快乐就好!、 话说当年Dennis Ritchie在贝尔实验室做了一件开天盘古的大事件,发明了c语言,从此c语…...

Qwen3.5-9B快速部署方案:本地IP直连+防火墙端口开放实操

Qwen3.5-9B快速部署方案:本地IP直连防火墙端口开放实操 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解(图文输入)和长上下文处理(最…...

FireRed-OCR Studio部署教程:Qwen3-VL工业级文档解析一键启动

FireRed-OCR Studio部署教程:Qwen3-VL工业级文档解析一键启动 1. 工具介绍 FireRed-OCR Studio是一款基于Qwen3-VL模型开发的工业级文档解析工具。它能将纸质文档、PDF截图等图像内容精准转换为结构化Markdown格式,特别擅长处理以下复杂内容&#xff1…...

JavaScript+WebGL可视化LingBot-Depth点云数据

JavaScriptWebGL可视化LingBot-Depth点云数据 1. 引言 想象一下,你手里有一个深度相机,它能捕捉到周围环境的3D信息,但原始数据往往充满了噪声和缺失区域。这就是LingBot-Depth发挥作用的地方——它能将不完整、有噪声的深度数据转换为高质…...

AI元人文:意义行为原生论的发生学阐明与伦理中间件建构

AI元人文:意义行为原生论的发生学阐明与伦理中间件建构摘要:本文旨在系统阐述一种名为“意义行为原生论”的理论框架,其核心结构为“舍得结构”。该理论拒斥将意义视为某种先验实体或行为结果的附属品,而是将其锚定于D&#xff08…...

Qwen3-TTS快速入门:上传15秒语音,一键生成你的专属AI配音

Qwen3-TTS快速入门:上传15秒语音,一键生成你的专属AI配音 1. 为什么选择Qwen3-TTS进行语音克隆 想象一下这样的场景:你需要为视频教程配音,但自己录音总是卡壳;或者想给海外客户发语音邮件,却苦于外语发音…...

Vision Transformers与CNN-Transformer混合架构:演进、融合与应用全景

1. Vision Transformers的崛起与挑战 2017年Transformer架构在NLP领域大放异彩后,计算机视觉研究者开始思考:能否用同样的方式处理图像?2020年Dosovitskiy等人提出的Vision Transformer(ViT)给出了肯定答案。与CNN逐层…...

多进程-生产者消费者C++实现

条件变量通常与互斥锁配合使用,用于线程之间的通信和同步。它允许线程在某个条件满足之前等待,当条件满足时,其他线程可以通知等待的线程继续执行。例如,在生产者 - 消费者模型中,生产者线程生产数据后,通过…...

冲刺待办列表管理化技术任务分解与估算

冲刺待办列表管理化技术任务分解与估算:高效协作的核心 在快节奏的软件开发中,冲刺待办列表(Sprint Backlog)是敏捷团队实现目标的关键工具。通过将复杂任务拆解为可执行单元并合理估算工作量,团队能提升交付效率与质…...

R 绘图 - 函数曲线图

R 绘图 - 函数曲线图 引言 在数据分析和可视化领域,R 语言因其强大的数据处理和绘图能力而备受推崇。函数曲线图是一种常见的图表类型,它能够帮助我们直观地了解函数的形态、变化趋势以及特征点。本文将详细介绍如何使用 R 语言绘制函数曲线图&#xff0…...

终极Flash浏览器解决方案:让经典Flash游戏重获新生的简单免费工具

终极Flash浏览器解决方案:让经典Flash游戏重获新生的简单免费工具 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 还在为Flash停用后无法玩经典游戏而烦恼吗?CefFl…...

MIT 6.S081 Lab1通关笔记:手把手教你用xv6实现管道通信与文件查找

MIT 6.S081 Lab1实战解析:从管道通信到文件查找的深度实现 操作系统作为计算机科学的核心领域,其底层机制的理解往往需要理论与实践相结合。MIT 6.S081课程通过xv6这个精简的教学操作系统,为学生提供了绝佳的实践平台。本文将聚焦Lab1中的关键…...

PowerShell文件切割避坑指南:如何正确处理含中文的CSV大文件

PowerShell文件切割避坑指南:如何正确处理含中文的CSV大文件 在电商数据分析和用户行为研究的日常工作中,数据工程师经常需要处理动辄几十GB的CSV文件。这些文件往往包含大量中文内容,从商品名称到用户评论,编码问题成为数据处理的…...

UniApp实战:Android原生插件实现动态时间水印踩坑全记录(附完整代码)

UniApp实战:Android原生插件实现动态时间水印的深度优化方案 在移动应用开发中,视频处理一直是技术难点之一,特别是需要实时添加动态时间水印的场景。本文将分享在UniApp中开发Android原生插件时,如何高效实现动态时间水印功能&am…...

高效智能的B站会员购抢票神器:让二次元门票不再难求

高效智能的B站会员购抢票神器:让二次元门票不再难求 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在动漫文化蓬勃发展的今天,B站会员购已成为众多二次元爱好者获取漫展…...

Windows安卓子系统终极指南:从零到精通完整教程

Windows安卓子系统终极指南:从零到精通完整教程 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 你知道吗?Windows 11上运行安卓应用不…...

用Python和CCXT库从零搭建一个数字货币量化交易机器人(附完整代码)

用Python和CCXT库从零搭建数字货币量化交易机器人 数字货币市场24小时不间断运行,价格波动剧烈,这为量化交易提供了天然土壤。与传统人工交易相比,量化交易能避免情绪干扰,严格执行策略,快速捕捉市场机会。本文将手把手…...

NaViL-9B医疗影像初筛:X光片描述生成+异常区域提示案例

NaViL-9B医疗影像初筛:X光片描述生成异常区域提示案例 1. 医疗影像AI助手简介 在医疗影像诊断领域,医生每天需要处理大量X光片、CT等影像资料。传统人工阅片方式存在效率瓶颈,特别是在基层医疗机构,专业放射科医生资源更为紧缺。…...

RVC开源贡献指南:如何为RVC WebUI新增语言/功能模块

RVC开源贡献指南:如何为RVC WebUI新增语言/功能模块 1. 引言:从使用者到贡献者 你可能已经用RVC WebUI玩过AI翻唱,或者用它把自己的声音变成各种有趣的音色。这个工具确实强大,3分钟就能训练一个新模型,让语音转换变…...