转载自:

http://bbs.21ic.com/icview-2579020-1-1.html

本帖最后由 千岁寒 于 2018-11-5 13:00 编辑

1、什么是分散加载    
      简单来说就是让编译器告诉MCU内核哪里存的是代码、哪里存的是数据,去哪个特定的地址找到下一步需要运行的函数,就是告诉编译器把每一个编译好的函数、数据放到具体的哪一个物理地址。

2、分散加载常见应用场景
        * Bootloader & 程序升级
     Bootloader的原理就简单来说在MCU的Flash里面同时摆放2个(或多个)不同工程的程序,一个Bootloader程序和一个用户程序,那么这就需要调整分散加载文件,以达成在一个Flash里面同时摆放两个不同程序的目的。
       程序升级都是为了增加一个小功能或修复一个小BUG,不需要全部升级而是只升级一点点。当然要实现这个功能同样需要分散加载的配合,把可能会后续升级的部分函数或数据事先分配好空间,留好空间上的余量,这些都需要分散加载来完成。

* 加速程序运行速度(如:对速度有较高要求的算法等、RTOS kernel)
        在SRAM中运行的程序要比在XIP Flash中执行要快,性能提升明显。

* 访问扩展存储&对存储区的划分
       如果要把外扩的存储用于运行代码/扩展RW数据段等用途,简单来说就是把片内地址映射到片外,需要按照寻址空间的方式来访问扩展存储的话,比如扩展Nor-Flash、扩展SDRAM、扩展SRAM等,那就需要分散加载配合。(只作存储数据的话,分散加载不是必要的!!!)

3、分散加载的基本结构定义以及分散加载的目的

Code段:表示程序代码部分
    RO-data段:程序定义的所有常量以及const类型数据
    RW-data段:已经初始化的所有静态变量
    ZI-data段:未初始化的静态变量
    RO段:指Code以及RO-data的统称
            具体分布可查看对应的*.map文件。
    RW+ZI数据段最终运行时会占用片内SRAM或外扩的RAM存储器,而Code+RO-data+RW-data数据最终会产生对片内Flash的占用或外扩程序存储区的占用。
所以分散加载的根本目的就是:
        * 指引把RO-data数据段、RW数据段从片内程序存储区里面(一般是片内Flash),搬到片内程序运行区(一般是片内SRAM);
        * 在片内程序运行区(一般是片内SRAM)内分配ZI数据段运行需要的空间并把这段数据初始化为0;
        * 初始化堆栈;
        * 对于有些指定加载到程序运行区(一般是片内SRAM)的RO数据段,把他们加载到程序运行区(一般是片内SRAM)里面。

{ 类比:这个和使用的电脑运行操作系统或者软件原理类似,电脑就是把硬盘里面的操作系统加载到内存里面,然后CPU从内存里面取数据以及程序指令来运行的。}

TIP:
        RW以及ZI数据段的初始化是在分散加载过程中完成的,也就是在__main中完成的,比如你定义一个全局变量,并给它赋值,只有在__main结束后你才能看到这个全局变量被赋值成功的,也就是说在__main之前,使用全局变量是行不通的。

整理参考: https://blog.csdn.net/weixin_39118482/article/details/79849133

[STM32] 分散加载文件 之一 (初探)相关推荐

  1. [STM32] 分散加载文件之二 (分散加载的结构)

    转载自: http://bbs.21ic.com/icview-2579052-1-1.html 本帖最后由 千岁寒 于 2018-11-5 13:01 编辑 举个例子: ; ************ ...

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

    一直在用ARM的Cortex-M系列做产品开发,也陆陆续续学习了ARM的启动流程.汇编启动文件,但是总感觉没有连贯的把全部知识串起来,不知道某些汇编语句为什么要这么写,没法按照自己的情况进行修改.今天 ...

  3. keil STM32中sct 分散加载文件学习

    sct 分散加载文件简介 MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节 ...

  4. 浅析keil的scf分散加载文件-基于STM32的例程

    浅析keil的scf分散加载文件-基于STM32的例程 关于分散加载文件 分散加载文件.sct 关于分散加载文件 keil编译器在链接的时候,是根据分散加载(.scf后缀的文件)来确定程序的加载域和运 ...

  5. IMXRT 分散加载文件 修改OCRAM,DTCM、ITCM大小

    分散加载 MXRT1052/1064芯片的RAM空间分为四种类型:ITCM,DTCM,OCRAM以及外部SDRAM,其中前面三个属于芯片内部RAM,RT1052有512KB,RT1064为1MB,支持 ...

  6. 【转载】ADS分散加载文件使用总结(lpc23xx)

    有如下分散加载文件: ROM_LOAD 0x00000000              ;// Origination Point of Code (Code in Flash) {     ROM_ ...

  7. keil的sct文件_keil .sct分散加载文件及其应用(重点必看)

    (3)分散加载文件语法 load_region_name  start_address | "+"offset  [attributes] [max_size] { executi ...

  8. Scatterfile分散加载文件和 mem.scf

     今天仔细学习周立功的模板的过程中,发现了几个.scf文件,自己不知道这是什么东西,所以学习了下: (一) 这是一位网友写的关于mem_a.scf,mem_b.scf,mem_c.scf文件的见解 ...

  9. 小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM

    小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM 1 前言 2 执行域和加载域 2 相关语法解析 3 实例解说 4 链接代码至RAM运行 4.1 链接单个section至R ...

最新文章

  1. pytorch对张量的一些常用处理以及numpy对数组的一些常用处理
  2. Python zipfile模块(压缩解压zip)
  3. 「1s」即可!用 VS Code 一键玩转 GitHub 代码!
  4. PHP作用域和文件夹操作
  5. java 人脸识别 demo_基于虹软sdk,java实现人脸识别(demo)
  6. Retinex算法详解
  7. 马云单挑“叶问”吊打“战狼”,网友:原来天下武功,唯富不破~是贫穷限制了我的想象力
  8. APISpace 手机号码归属地和运营商查询API
  9. mysql数据库用sql进行增删改操作
  10. java.io的缓冲流、转换流、序列化流
  11. 3D世界 ORGE SceneManager GetStart
  12. Maven的jar包无法导入/彻底解决unable to find valid certification path to requested target
  13. sql server 系统表 介绍
  14. js原生后代选择器_js 后代选择器
  15. 春款童装产品做短视频营销应该怎么做?短视频营销策略分析
  16. python爬虫 - 代理ip正确使用方法
  17. 智能风控平台核心之风控决策引擎(一)
  18. PAT甲级Invert a Binary Tree 柳神层序遍历的思路值得借鉴
  19. IOS-UIImageView
  20. 实验11 虚函数与多态

热门文章

  1. 超声波换能器的几点总结
  2. 西安公交卡终于合算了:公交IC卡16日起乘车票价五折(中小学生三折)
  3. python-石头剪刀布
  4. windows 文件夹设置 everyone 共享
  5. Linux高性能服务器I/0高级应用:非阻塞connect(15)
  6. pHP 眼病,眼科疾病phpv什么意思 深入了解永存原始玻璃体增生症
  7. 笔试题32——超市找零方案
  8. lanmbda表达式
  9. 【D3使用教程】(4) 添加数轴
  10. 水晶报表:CR2020和CR4E