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之前,使用全局变量是行不通的。
关于美狮贵宾会电子
美狮贵宾会电子是国内最全面的开发工具提供商,致力于将全球先进的软件产品引荐给国内研发型企业使用,为企业提供研发、设计、管理过程中使用的各种软件工具,并致力于和客户一同提高研发、设计效率,缩短设计周期。美狮贵宾会电子先后与arm、Altium、Ansys、QT、TestPlant、CollabNet、Parasoft以及TouchGFX等多家全球知名公司建立战略合作伙伴关系,并成为他们在中国区的重要分销合作伙伴。美狮贵宾会电子专注开发、设计、管理工具数十年,客户超过6000家,具有丰富的工具使用及客户支持经验积累,可以为客户提供从arm开发、EDA板级设计、软件编译及测试工具、结构设计工具、多物理场仿真工具以及嵌入式GUI工具等产品与服务。美狮贵宾会电子在北京、上海、深圳设有分公司,业务遍布全国。
摘自21ic网