基于MDK的分散加载文件

【STM32】sct 分散加载文件的格式与应用 在 MDK 的“Options for Target->Linker->Use Memory Layout from Target Dialog”选项可配置该选择。1.勾选时, 阅读详情

    面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有了,BAIDU来的都不全面,这是一种学习方法。

    http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm

    这个链接是我在官网上找到的关于分散加载文件的资料。讲的比较详细了。这里通过一个例子记录下我学习的过程,通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。

    先贴下我的sct文件:

LR_IROM1 0x00000000 0x00002000  
{ 
	ER_IROM1 0x00000000 0x00020000  
	{
		*.o (RESET, +First)
		*(InRoot$$Sections)
		startup_lpc177x_8x.o (+RO)
		system_LPC177x_8x.o (+RO)
	}
	
	RW_IRAM1 0x20000000 0x00004000  
	{
		.ANY (+RW +ZI)
	}
}

LR_IROM2 0x00002000	0x0007E000
{
	VECTOR 0x10000000 EMPTY 0xE4
	{
	}
	
	ER_IRAM1 +0
	{
		.ANY (+RO)
	}
}


这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。

    下面用一张图来表示这个程序的加载域和执行域:

 

其实加载域的empty这块区域是不用空出来的,主要是运行域要空出来,用来拷贝中断向量,看个人喜好了,我觉得空出来方便引用这块区域的执行域地址。


    这样框架就比较清楚了,拷贝的程序清单如下:

extern unsigned char Image$$VECTOR$$Base;
extern unsigned char Image$$VECTOR$$Length;

extern unsigned char Load$$ER_IRAM1$$Base;
extern unsigned char Image$$ER_IRAM1$$Base;
extern unsigned char Image$$ER_IRAM1$$Length;

void CopyCode2Ram ()
{
    unsigned char *pSrc, *pDes;
    unsigned int count;
    
    SCB->VTOR = 0x10000000;
    
    pSrc = 0;
    pDes = (unsigned char*)&Image$$VECTOR$$Base;
    count = 0xE4;
    
    while (count--)
    {
        *pDes++ = *pSrc++;
    }
    
    
    count = (unsigned int)&Image$$ER_IRAM1$$Length;
    pDes = (unsigned char*)&Image$$ER_IRAM1$$Base;
    pSrc = (unsigned char*)(&Load$$ER_IRAM1$$Base + 0xE4);
    
    while (count--)
    {
        *pDes++ = *pSrc++;
    }
}

其中拷贝中断向量的时候要指定中断向量的偏移地址。Load$$ER_IRAM1$$Base表示执行域ER_IRAM1的加载地址;Image$$ER_IRAM1$$Base表示执行域ER_IRAM1的执行地址;Image$$ER_IRAM1$$Length表示执行域ER_IRAM1的实际长度,VECTOR区域因为是EMPTY,所以实际长度是0,而中断向量的长度是固定的,所以程序里就写了个常数。

ARM之一 分散加载文件(scatter)详述 1. 基础知识   为了充分理解分散加载文件的魅力,必须对工程编译后的内容有详细的了解。   编译后的内容如下所示:   1)Code:为程序代码部分;   2)RO-Data:表示程序定义的常量及 const 型数据;   3)RW-Data:表示已经初始化的静态变量,变量有初值;   4)ZI-Data:表示未初始化的静态变量,变量无初值。   当 Keil 工程编译完成后,查看其 map 文件,可得到结果如程序清单。 ========================================== 阅读详情

相关推荐

keil将程序装入外部FLASH详解

keil下将程序装入外部FLASH的过程详解及出现问题的解决方案

waitig's blog 2万+

手把手带你玩转分散加载(附代码)

分散加载基本概念 分散加载描述文件语法概述 加载时域描述 运行时域的描述 输入段描述 简单分散加载存储器映射示例 复杂分散加载存储器映射示例

粉色挖掘机的博客 2875

MDK分散加载文件解析与内存优化技巧

在嵌入式系统开发中,内存管理是影响系统性能和稳定性的核心技术。程序的内存布局通过链接脚本(如MDK的.sct分散加载文件)精确控制,涉及Flash、SRAM等存储介质的特性差异。Flash适合存储程序代码和常量,而SRAM用于运行时变量,两者在读写速度和数据保持性上存在显著差异。通过合理配置分散加载文件,开发者可以优化关键函数执行效率(如将热点代码放入RAM可提升30%性能),解决多RAM区域芯片的内存分配难题,并有效排查Section overlaps等常见链接错误。这些技术在STM32等ARM架构MCU

weixin_36431814的博客 556

MDK 分散加载文件剖析(一)

MDK 分散加载文件剖析与实战

Tang的博客 6568

Keil MDK内存布局掌控:变量与函数属性及分散加载文件实战

嵌入式开发中,程序的内存布局往往决定了系统稳定性与运行效率。编译器默认将变量和函数分类到不同段,再通过链接脚本分配地址,但在Bootloader升级、外部SDRAM扩展、Flash擦写等场景下,这种自动化分配常无法满足需求。理解变量属性和函数属性的工作原理,是精准控制地址分配的基础。通过__attribute__语法可自定义段名,配合分散加载文件(scatter file)手动映射执行域,能将大数组、关键标志或中断函数固定到指定内存区域,从而解决变量被优化、地址冲突或函数跑飞等疑难问题。ARM Compil

weixin_29168393的博客 230

深入解析Keil MDK分散加载文件:Cortex-M内存布局与实战指南

在嵌入式开发中,链接脚本决定了代码与数据最终落在存储器的哪个位置。对于Cortex-M系列芯片,Keil MDK提供的分散加载文件(.sct)正是掌管这种地址映射的关键机制。它定义了加载域与执行域的划分,影响着程序从Flash加载到RAM运行的整个过程。理解Scatter文件,不仅能让你灵活配置Bootloader与App的分区,还能实现将Flash擦写函数搬运到RAM执行、在外部SDRAM放置大块数据等高级用法。掌握其语法与调试方法,可以从根本上解决链接失败、程序跑飞、地址冲突等顽固问题,让内存布局尽在掌

weixin_34194829的博客 198

Keil MDK的sct分散加载文件详解

MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。工程构建时, MDK 会根据我们选择的芯片型号,获知芯片的内部 FLASH 及内部SRAM 存储器概况。这里我选择的是STM32F103VET6型号, 这款单片机有 64 KB 的 SRAM,512 KB的 ROM 内存,可以通过规格书查到。

a只如初见的博客 2万+

三模冗余设计

在数字电路设计中,Voter模块(表决器) 和 三模冗余(Triple Modular Redundancy, TMR) 是高可靠性系统的核心设计技术,主要用于容错和抗辐射(如航天、医疗设备等关键领域)。容错机制:若任一模块故障(如SEU,单粒子翻转),其他两个模块仍能保证正确输出。功耗与面积:TMR会显著增加资源占用(约3倍),需权衡可靠性和成本。航天电子:抗辐射芯片(如FPGA)中用于防止单粒子翻转(SEU)。故障检测:可扩展设计以检测并隔离故障模块(如通过BIST)。

qq_45776815的博客 2054

MDK 分散加载文件分析

1.1      Realview MDK链接程序的两种方式 使用RealviewMDK时不可避免的要涉及到链接脚本文件,特别是编译链接那些大的工程文件时更是如此。在链接脚本中可以指定代码的存储布局,可以将代码段、只读数据段、可读写的数据段分别存放,甚至可以精确地指定代码放置的位置,这一点是很关键的,譬如说启动代码就必须放在可执行文件的开始位置。由于链接脚本重要性,开发者必须掌握其编写的

Wang Blog 4265

WorkBuddy实战技巧:搭建高效AI工作台与自动化流程

在数字化办公场景中,AI工作台正逐渐成为提升个人与团队效率的关键工具。它不同于简单的聊天机器人,而是通过集成技能包(Skill)、自动化触发与文档处理能力,把重复性任务如信息提取、周报生成、数据表格整理等变为标准化流程。其核心原理在于将用户需求拆解为可执行的指令链,并借助本地脚本、API调用及定时任务实现“对话即操作”的智能协作。这种技术价值不仅适用于程序员,更惠及运营、客服、行政、科研等日常与文字数据打交道的群体。从自动签到、会议纪要,到批量处理Excel与合同要点提取,AI工作台的应用场景已覆盖多个高频

weixin_42547431的博客 333

华为昇腾NPU环境搭建:torch-npu安装避坑指南(附常见错误解决方案)

本文详细解析了在华为昇腾NPU环境中安装torch-npu适配包的全流程与核心要点。从基础环境准备、严格的版本匹配策略,到针对‘RuntimeError: NPU error’、‘ImportError: libxxx.so’等高频错误的深度解析与解决方案,提供了一份实用的避坑指南,旨在帮助开发者高效搭建稳定的PyTorch开发环境。

weixin_29094979的博客 411

MDK分散加载文件(*.sct)学习随笔

分散加载就是我们开发者能指定你的代码或者数据变量到指定的内存空间中运行。通知链接器把程序的某一部分连接在存储器的某个地址空间,我们可以通过编写一个分散加载文件来指定 ARM 连接器在生成映像文件时如何分配 Code、RO-Data, RW-Data, ZI-Data 等数据的存放地址。

harry_xiaobao的博客 1119

把 ABAP SQL 窗口函数讲透:从 OVER 到 LEAD、RANK 与累计分析

ABAP SQL窗口函数在不丢失明细记录的前提下,为每行数据提供组内统计和排名功能。它通过OVER子句定义计算窗口,支持三类函数:聚合型(AVG/SUM等)、排名型(ROW_NUMBER/RANK等)和取值型(LEAD/LAG)。相比GROUP BY会合并多行数据,窗口函数保留原始记录同时附加计算结果,特别适合需要保留明细又要展示统计信息的业务场景,如销售排名、客户分层分析等。语法核心是OVER子句,通过PARTITION BY分组,ORDER BY排序,可灵活定义计算范围。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1274

mdk sct 分散加载文件 - 周立功

mdk sct 分散加载文件 - 周立功 【下载地址】mdksct分散加载文件-周立功 此开源项目提供了一个专为MDK(Microcontroller Development Kit)开发的SCT分散加载文件,由周立功精心整理。SCT文件在嵌入式系统开发中至关重要,用于配置微控制器的内存映射,定义程序的加载区域和内存布局...

gitblog_06732的博客 354

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 585

CSP-J2019普及组复赛T4:加工零件

CSP-J2020普及组复赛T1:优秀的拆分,广度优先遍历求最短路。

少儿编程乔老师 1854

【C语言常识】Keil MDK的分散加载文件.sct

https://blog.youkuaiyun.com/wuhenyouyuyouyu/article/details/71171546?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164259812916780269822566%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164259812916780269822566&biz_id

dianqicyuyan的博客 2151

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

手把手教你认识 Keil MDK分散加载文件

在 i.MX RT1052 上 ITCM、DTCM 和 OCRAM 共享 512KB 的 FlexRAM,因此上面的图中才可以把 Heap 放在 ITCM 上,却在 DTCM 上让出了 Heap 的位置。在 《KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则》 中有详细解说。关于什么是“域”,在周立功 《分散加载/分散加载文件浅释.pdf》 中有述。3、第一个运行时域的基地址必须与加载域基地址相同。2、规定其余运行时域中存放的代码均会被拷贝。来源 | MultiMCU EDU。

strongerHuang 384

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MDK 分散加载文件(.sct)剖析及应用

MDK 分散加载文件(.sct)剖析及应用

m0_69841436的博客 1198

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Keil5 MDK在Cortex M系列关于分散加载文件说明指导

本文介绍了在Keil MDK工程中使用分散加载文件(scatter)实现代码地址精确分配的方法。通过LCM32F067的SRAM示例工程,详细说明了如何将函数固定到指定Flash地址或搬运到指定RAM地址运行。内容包括:分散加载的基本概念、语法规则、实际应用实例和常见问题。重点讲解了如何通过section标签、执行域定义和FIXED属性,实现函数在0x08000800等Flash固定地址和0x20000000等RAM地址的运行配置,并提供了map文件验证方法。该技术适用于需要精确控制代码布局、实现固定接口或

u014079226的博客 1039

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在MDK环境下使用分散加载描述文件

发现出错了……编译通过仿真没问题,但运行不了,估计还是没设置好。等待改进!调研中……   为免我把这两天的学习成果忘了,还是在这里做个备忘吧,同时也希望对正在迷茫的同道中人有所帮忙。    环境: IDE环境:RealView MDK 4.0 芯片:STM32F1

小鱼儿的窝 2128

从MDK分散加载文件学习STM32启动流程

一直在用ARM的Cortex-M系列做产品开发,也陆陆续续学习了ARM的启动流程、汇编启动文件,但是总感觉没有连贯的把全部知识串起来,不知道某些汇编语句为什么要这么写,没法按照自己的情况进行修改。今天从连接器及连接脚本入手,梳理一下完整流程。 一、基本概念 嵌入式系统开发完成最终的映像文件是需要写入到嵌入式设备的ROM/FLASH中断的。常见的映像文件格式包括bin和hex文件。AXF/ELF文...

qq_19582165的博客 274

软件_PC机编程软件_keil之MDK的分散加载文件.SCT文件

转载自:http://blog.youkuaiyun.com/tracing/article/details/9720157 MDK的分散加载文件.SCT文件 面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有了,BAIDU来的都不全面,这是一种学习方法。     http://www.keil.com/support/man/docs/armlink/a

记录人生 2251
上一篇: Makefile里的sed指令
下一篇: 程序终于编译过去了,记录下碰到的问题及解决方法
tracing
博客等级 码龄20年 108粉丝 52原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值